Decompiled source of MoreFunCompany v2.0.3

plugins/Gemumoddo-BadAssCompany/BadAssCompany.dll

Decompiled 6 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using EmotesAPI;
using Microsoft.CodeAnalysis;
using UnityEngine;

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

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
public class LivingParticlesAudioModule : MonoBehaviour
{
	public Transform audioPosition;

	public LivingParticlesAudioSource LPaSourse;

	public bool useBuffer;

	public bool firstAndLastPixelBlack = false;

	private Texture2D t2d;

	private float[] finalSpectrum;

	private Color col = Color.black;

	private ParticleSystemRenderer psr;

	private void Start()
	{
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_0050: Expected O, but got Unknown
		//IL_0035: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Expected O, but got Unknown
		//IL_0074: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: Expected O, but got Unknown
		//IL_0062: Unknown result type (might be due to invalid IL or missing references)
		//IL_006c: Expected O, but got Unknown
		psr = ((Component)this).GetComponent<ParticleSystemRenderer>();
		switch (LPaSourse.numberOfBands)
		{
		case LivingParticlesAudioSource._numberOfBands.Bands8:
			if (firstAndLastPixelBlack)
			{
				t2d = new Texture2D(10, 1);
			}
			else
			{
				t2d = new Texture2D(8, 1);
			}
			break;
		case LivingParticlesAudioSource._numberOfBands.Bands16:
			if (firstAndLastPixelBlack)
			{
				t2d = new Texture2D(18, 1);
			}
			else
			{
				t2d = new Texture2D(16, 1);
			}
			break;
		}
		((Texture)t2d).wrapMode = (TextureWrapMode)0;
	}

	private void Update()
	{
		//IL_00e1: 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_01b1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b6: 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_014d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0163: Unknown result type (might be due to invalid IL or missing references)
		if (useBuffer)
		{
			switch (LPaSourse.numberOfBands)
			{
			case LivingParticlesAudioSource._numberOfBands.Bands8:
				finalSpectrum = LPaSourse.finalBands8Buffer;
				break;
			case LivingParticlesAudioSource._numberOfBands.Bands16:
				finalSpectrum = LPaSourse.finalBands16Buffer;
				break;
			}
		}
		else
		{
			switch (LPaSourse.numberOfBands)
			{
			case LivingParticlesAudioSource._numberOfBands.Bands8:
				finalSpectrum = LPaSourse.finalBands8;
				break;
			case LivingParticlesAudioSource._numberOfBands.Bands16:
				finalSpectrum = LPaSourse.finalBands16;
				break;
			}
		}
		for (int i = 0; i < finalSpectrum.Length; i++)
		{
			col.r = finalSpectrum[i];
			if (firstAndLastPixelBlack)
			{
				t2d.SetPixel(i + 1, 0, col);
			}
			else
			{
				t2d.SetPixel(i, 0, col);
			}
		}
		if (firstAndLastPixelBlack)
		{
			t2d.SetPixel(0, 0, Color.black);
			switch (LPaSourse.numberOfBands)
			{
			case LivingParticlesAudioSource._numberOfBands.Bands8:
				t2d.SetPixel(9, 0, Color.black);
				break;
			case LivingParticlesAudioSource._numberOfBands.Bands16:
				t2d.SetPixel(17, 0, Color.black);
				break;
			}
		}
		t2d.Apply();
		((Renderer)psr).material.SetTexture("_AudioSpectrum", (Texture)(object)t2d);
		((Renderer)psr).material.SetVector("_AudioPosition", Vector4.op_Implicit(audioPosition.position));
		switch (LPaSourse.numberOfBands)
		{
		case LivingParticlesAudioSource._numberOfBands.Bands8:
		{
			int num = 1;
			float amplitudeBuffer = (LPaSourse.amplitudeBuffer8 + 48f) / 48f;
			LPaSourse.amplitudeBuffer8 = amplitudeBuffer;
			((Renderer)psr).material.SetFloat("_AudioAverageAmplitude", LPaSourse.amplitudeBuffer8);
			break;
		}
		case LivingParticlesAudioSource._numberOfBands.Bands16:
			((Renderer)psr).material.SetFloat("_AudioAverageAmplitude", LPaSourse.amplitudeBuffer16);
			break;
		}
	}
}
public class LivingParticlesAudioSource : MonoBehaviour
{
	public enum _numberOfBands
	{
		Bands8,
		Bands16
	}

	public AudioClip audioClip;

	[Range(0.1f, 2f)]
	public float bufferInitialDecreaseSpeed = 1f;

	[Range(0f, 10f)]
	public float bufferDecreaseSpeedMultiply = 5f;

	public float freqBandsPower = 10f;

	public float audioProfileInitialValue = 5f;

	public bool audioProfileDecreasing = true;

	public float audioProfileDecreasingSpeed = 0.1f;

	public _numberOfBands numberOfBands = _numberOfBands.Bands8;

	private float[] initialSamplesL = new float[512];

	private float[] initialSamplesR = new float[512];

	private float[] freqBands8 = new float[8];

	private float[] freqBands8Buffer = new float[8];

	private float[] freqBands8BufferDecrease = new float[8];

	private float[] freqBands8Highest = new float[8];

	private float[] freqBands16 = new float[16];

	private float[] freqBands16Buffer = new float[16];

	private float[] freqBands16BufferDecrease = new float[16];

	private float[] freqBands16Highest = new float[16];

	private AudioSource audioSource;

	[HideInInspector]
	public float[] finalBands8 = new float[8];

	[HideInInspector]
	public float[] finalBands8Buffer = new float[8];

	[HideInInspector]
	public float[] finalBands16 = new float[16];

	[HideInInspector]
	public float[] finalBands16Buffer = new float[16];

	[HideInInspector]
	public float amplitude8;

	[HideInInspector]
	public float amplitudeBuffer8;

	[HideInInspector]
	public float amplitude16;

	[HideInInspector]
	public float amplitudeBuffer16;

	private float amplitudeHighest;

	private static bool speaking;

	private uint _length = 0u;

	private bool yote = false;

	private float[] left;

	private float[] right;

	private double[] _window;

	private void Start()
	{
		audioSource = ((Component)this).GetComponent<AudioSource>();
		AudioProfile(audioProfileInitialValue);
	}

	public void StartAudio()
	{
		Reset();
	}

	public void Reset()
	{
		_length = 0u;
	}

	private static bool readWav(string filename, out float[] L, out float[] R, out uint samplerate, out uint channels)
	{
		speaking = true;
		L = (R = null);
		samplerate = 0u;
		channels = 0u;
		try
		{
			using FileStream input = File.Open(filename, FileMode.Open);
			BinaryReader binaryReader = new BinaryReader(input);
			int num = binaryReader.ReadInt32();
			int num2 = binaryReader.ReadInt32();
			int num3 = binaryReader.ReadInt32();
			int num4 = binaryReader.ReadInt32();
			int num5 = binaryReader.ReadInt32();
			int num6 = binaryReader.ReadInt16();
			int num7 = binaryReader.ReadInt16();
			int num8 = binaryReader.ReadInt32();
			int num9 = binaryReader.ReadInt32();
			int num10 = binaryReader.ReadInt16();
			int num11 = binaryReader.ReadInt16();
			samplerate = (uint)num8;
			channels = (uint)num7;
			if (num5 == 18)
			{
				int count = binaryReader.ReadInt16();
				binaryReader.ReadBytes(count);
			}
			int num12 = binaryReader.ReadInt32();
			int num13 = binaryReader.ReadInt32();
			byte[] src = binaryReader.ReadBytes(num13);
			int num14 = num11 / 8;
			int num15 = num13 / num14;
			float[] array = null;
			switch (num11)
			{
			case 64:
			{
				double[] array3 = new double[num15];
				Buffer.BlockCopy(src, 0, array3, 0, num13);
				array = Array.ConvertAll(array3, (double e) => (float)e);
				break;
			}
			case 32:
				array = new float[num15];
				Buffer.BlockCopy(src, 0, array, 0, num13);
				break;
			case 16:
			{
				short[] array2 = new short[num15];
				Buffer.BlockCopy(src, 0, array2, 0, num13);
				array = Array.ConvertAll(array2, (short e) => (float)e / 32768f);
				break;
			}
			default:
				return false;
			}
			switch (channels)
			{
			case 1u:
				L = array;
				R = null;
				return true;
			case 2u:
			{
				int num16 = num15 / 2;
				L = new float[num16];
				R = new float[num16];
				int i = 0;
				int num17 = 0;
				for (; i < num16; i++)
				{
					L[i] = array[num17++];
					R[i] = array[num17++];
				}
				return true;
			}
			default:
				return false;
			}
		}
		catch
		{
			Debug.Log((object)("...Failed to load: " + filename));
			return false;
		}
	}

	private bool WavBufferToWwise(uint playingID, uint channelIndex, float[] samples)
	{
		if (left.Length == 0)
		{
			DebugClass.Log((object)"There was an error playing the audio file, The audio buffer is empty!");
		}
		if (_length >= (uint)left.Length)
		{
			_length = (uint)left.Length;
		}
		initialSamplesL = new float[samples.Length];
		initialSamplesR = new float[samples.Length];
		try
		{
			uint num = 0u;
			for (num = 0u; num < samples.Length; num++)
			{
				if (num + _length >= left.Length)
				{
					speaking = false;
					_length = 0u;
					break;
				}
				initialSamplesL[num] = left[num + _length];
				initialSamplesR[num] = right[num + _length];
				samples[num] = 0f;
			}
			_length += num;
		}
		catch (Exception)
		{
			Debug.Log((object)"--------end of audio???");
			throw;
		}
		if (_length >= (uint)left.Length)
		{
			_length = (uint)left.Length;
			speaking = false;
		}
		DoSpectrumDataStuff();
		return speaking;
	}

	private void ApplyWindow()
	{
		int num = initialSamplesL.Length;
		CreateWindow(num);
		for (int i = 0; i < num; i++)
		{
			initialSamplesL[i] = (float)((double)initialSamplesL[i] * _window[i]);
			initialSamplesR[i] = (float)((double)initialSamplesR[i] * _window[i]);
		}
	}

	private void DoSpectrumDataStuff()
	{
		ApplyWindow();
		switch (numberOfBands)
		{
		case _numberOfBands.Bands8:
			CreateFreqBands8();
			CreateBandBuffer8();
			CreateFinalBands8();
			CreateAmplitude8();
			break;
		case _numberOfBands.Bands16:
			CreateFreqBands16();
			CreateBandBuffer16();
			CreateFinalBands16();
			CreateAmplitude16();
			break;
		}
	}

	private void CreateWindow(int size, bool normalize = false)
	{
		_window = new double[size];
		for (int i = 0; i < size; i++)
		{
			double num = (double)i / (double)(size - 1);
			_window[i] = (double)(0.42f - 0.5f * Mathf.Cos((float)(i / size))) + 0.08 * (double)Mathf.Cos(2f * (float)i / (float)size);
		}
		if (normalize)
		{
			double num2 = 0.0;
			for (int j = 0; j < _window.Length; j++)
			{
				num2 += _window[j];
			}
			for (int k = 0; k < _window.Length; k++)
			{
				_window[k] /= num2;
			}
		}
	}

	private void AudioProfile(float audioProfileValue)
	{
		for (int i = 0; i < 8; i++)
		{
			freqBands8Highest[i] = audioProfileValue;
		}
		for (int j = 0; j < 16; j++)
		{
			freqBands16Highest[j] = audioProfileValue;
		}
	}

	private void CreateAmplitude8()
	{
		float num = 0f;
		float num2 = 0f;
		for (int i = 0; i < 8; i++)
		{
			num += finalBands8[i];
			num2 += finalBands8Buffer[i];
		}
		if (num > amplitudeHighest)
		{
			amplitudeHighest = num;
		}
		amplitude8 = num / amplitudeHighest;
		amplitudeBuffer8 = num2 / amplitudeHighest;
	}

	private void CreateAmplitude16()
	{
		float num = 0f;
		float num2 = 0f;
		for (int i = 0; i < 16; i++)
		{
			num += finalBands16[i];
			num2 += finalBands16Buffer[i];
		}
		if (num > amplitudeHighest)
		{
			amplitudeHighest = num;
		}
		amplitude16 = num / amplitudeHighest;
		amplitudeBuffer16 = num2 / amplitudeHighest;
	}

	private void CreateFinalBands8()
	{
		for (int i = 0; i < 8; i++)
		{
			if (audioProfileDecreasing)
			{
				freqBands8Highest[i] -= audioProfileDecreasingSpeed * Time.deltaTime;
			}
			if (freqBands8[i] > freqBands8Highest[i])
			{
				freqBands8Highest[i] = freqBands8[i];
			}
			finalBands8[i] = freqBands8[i] / freqBands8Highest[i];
			finalBands8Buffer[i] = freqBands8Buffer[i] / freqBands8Highest[i];
		}
	}

	private void CreateFinalBands16()
	{
		for (int i = 0; i < 16; i++)
		{
			if (audioProfileDecreasing)
			{
				freqBands16Highest[i] -= audioProfileDecreasingSpeed * Time.deltaTime;
			}
			if (freqBands16[i] > freqBands16Highest[i])
			{
				freqBands16Highest[i] = freqBands16[i];
			}
			finalBands16[i] = freqBands16[i] / freqBands16Highest[i];
			finalBands16Buffer[i] = freqBands16Buffer[i] / freqBands16Highest[i];
		}
	}

	private void CreateBandBuffer8()
	{
		for (int i = 0; i < 8; i++)
		{
			if (freqBands8[i] > freqBands8Buffer[i])
			{
				freqBands8Buffer[i] = freqBands8[i];
				freqBands8BufferDecrease[i] = bufferInitialDecreaseSpeed * freqBands8Highest[i] * Time.deltaTime;
			}
			if (freqBands8[i] < freqBands8Buffer[i])
			{
				freqBands8Buffer[i] -= freqBands8BufferDecrease[i];
				freqBands8BufferDecrease[i] *= 1f + bufferDecreaseSpeedMultiply * Time.deltaTime;
			}
		}
	}

	private void CreateBandBuffer16()
	{
		for (int i = 0; i < 16; i++)
		{
			if (freqBands16[i] > freqBands16Buffer[i])
			{
				freqBands16Buffer[i] = freqBands16[i];
				freqBands16BufferDecrease[i] = bufferInitialDecreaseSpeed * freqBands16Highest[i] * Time.deltaTime;
			}
			if (freqBands16[i] < freqBands16Buffer[i])
			{
				freqBands16Buffer[i] -= freqBands16BufferDecrease[i];
				freqBands16BufferDecrease[i] *= 1f + bufferDecreaseSpeedMultiply * Time.deltaTime;
			}
		}
	}

	private void CreateFreqBands8()
	{
		int num = 1;
	}

	private void CreateFreqBands16()
	{
		int num = 0;
		int num2 = 1;
		int num3 = 0;
		for (int i = 0; i < 16; i++)
		{
			float num4 = 0f;
			if (i == 2 || i == 4 || i == 6 || i == 8 || i == 10 || i == 12 || i == 14)
			{
				num3++;
				num2 = (int)Mathf.Pow(2f, (float)num3);
				if (num3 == 7)
				{
					num2++;
				}
			}
			for (int j = 0; j < num2; j++)
			{
				num4 += (initialSamplesL[num] + initialSamplesR[num]) * (float)(num + 1);
				num++;
			}
			num4 /= (float)num;
			freqBands16[i] = num4 * freqBandsPower * 2f;
		}
	}
}
namespace BadAssEmotes
{
	internal class CSS_Loader
	{
	}
}
namespace ExamplePlugin
{
	internal static class Assets
	{
		internal static readonly List<AssetBundle> AssetBundles = new List<AssetBundle>();

		private static readonly Dictionary<string, int> AssetIndices = new Dictionary<string, int>();

		internal static void LoadAssetBundlesFromFolder(string folderName)
		{
			folderName = Path.Combine(Path.GetDirectoryName(BadAssEmotesPlugin.PInfo.Location), folderName);
			string[] files = Directory.GetFiles(folderName);
			foreach (string text in files)
			{
				AssetBundle val = AssetBundle.LoadFromFile(text);
				int count = AssetBundles.Count;
				AssetBundles.Add(val);
				string[] allAssetNames = val.GetAllAssetNames();
				foreach (string text2 in allAssetNames)
				{
					string text3 = text2.ToLowerInvariant();
					if (text3.StartsWith("assets/"))
					{
						text3 = text3.Remove(0, "assets/".Length);
					}
					AssetIndices[text3] = count;
				}
				DebugClass.Log((object)("Loaded AssetBundle: " + Path.GetFileName(text)));
			}
		}

		internal static T Load<T>(string assetName) where T : Object
		{
			try
			{
				assetName = assetName.ToLowerInvariant();
				if (assetName.Contains(":"))
				{
					string[] array = assetName.Split(':');
					assetName = array[1].ToLowerInvariant();
				}
				if (assetName.StartsWith("assets/"))
				{
					assetName = assetName.Remove(0, "assets/".Length);
				}
				int index = AssetIndices[assetName];
				return AssetBundles[index].LoadAsset<T>("assets/" + assetName);
			}
			catch (Exception arg)
			{
				DebugClass.Log((object)$"Couldn't load asset [{assetName}] reason: {arg}");
				return default(T);
			}
		}
	}
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.weliveinasociety.badasscompany", "BadAssCompany", "1.1.0")]
	public class BadAssEmotesPlugin : BaseUnityPlugin
	{
		public const string PluginGUID = "com.weliveinasociety.badasscompany";

		public const string PluginAuthor = "Nunchuk";

		public const string PluginName = "BadAssCompany";

		public const string PluginVersion = "1.1.0";

		private int stageInt = -1;

		private int pressInt = -1;

		internal static GameObject stage;

		internal static GameObject press;

		internal static GameObject pressMechanism;

		internal static LivingParticleArrayController LPAC;

		public static BadAssEmotesPlugin instance;

		private static List<string> HatKidDances = new List<string>();

		private int stand = -1;

		private List<BoneMapper> punchingMappers = new List<BoneMapper>();

		private int prop1 = -1;

		public static PluginInfo PInfo { get; private set; }

		public void Awake()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0fe1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0fe7: Expected O, but got Unknown
			//IL_106d: Unknown result type (might be due to invalid IL or missing references)
			//IL_1072: Unknown result type (might be due to invalid IL or missing references)
			//IL_1077: Unknown result type (might be due to invalid IL or missing references)
			//IL_1092: Unknown result type (might be due to invalid IL or missing references)
			//IL_1097: Unknown result type (might be due to invalid IL or missing references)
			//IL_109c: Unknown result type (might be due to invalid IL or missing references)
			//IL_10b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_10f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_10fd: Expected O, but got Unknown
			//IL_112d: Unknown result type (might be due to invalid IL or missing references)
			//IL_1144: Unknown result type (might be due to invalid IL or missing references)
			//IL_114a: Expected O, but got Unknown
			//IL_117a: Unknown result type (might be due to invalid IL or missing references)
			//IL_11bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_11c1: Expected O, but got Unknown
			//IL_123b: Unknown result type (might be due to invalid IL or missing references)
			//IL_1470: Unknown result type (might be due to invalid IL or missing references)
			//IL_1476: Expected O, but got Unknown
			//IL_14cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_14d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_14d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_14e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_152b: Unknown result type (might be due to invalid IL or missing references)
			//IL_1531: Expected O, but got Unknown
			//IL_157a: Unknown result type (might be due to invalid IL or missing references)
			//IL_159f: Unknown result type (might be due to invalid IL or missing references)
			//IL_15a5: Expected O, but got Unknown
			//IL_15d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_18b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_18b7: Expected O, but got Unknown
			//IL_1922: Unknown result type (might be due to invalid IL or missing references)
			//IL_1927: Unknown result type (might be due to invalid IL or missing references)
			//IL_192c: Unknown result type (might be due to invalid IL or missing references)
			//IL_1938: Unknown result type (might be due to invalid IL or missing references)
			//IL_196f: Unknown result type (might be due to invalid IL or missing references)
			//IL_1975: Expected O, but got Unknown
			//IL_19cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_1a34: Unknown result type (might be due to invalid IL or missing references)
			//IL_1a3a: Expected O, but got Unknown
			//IL_1aa5: Unknown result type (might be due to invalid IL or missing references)
			//IL_1aaa: Unknown result type (might be due to invalid IL or missing references)
			//IL_1aaf: Unknown result type (might be due to invalid IL or missing references)
			//IL_1abb: Unknown result type (might be due to invalid IL or missing references)
			//IL_1aeb: Unknown result type (might be due to invalid IL or missing references)
			//IL_1af1: Expected O, but got Unknown
			//IL_1b48: Unknown result type (might be due to invalid IL or missing references)
			//IL_1b9e: Unknown result type (might be due to invalid IL or missing references)
			//IL_1ba4: Expected O, but got Unknown
			//IL_1c01: Unknown result type (might be due to invalid IL or missing references)
			//IL_1dfb: Unknown result type (might be due to invalid IL or missing references)
			//IL_1e05: Expected O, but got Unknown
			//IL_1e0d: Unknown result type (might be due to invalid IL or missing references)
			//IL_1e17: Expected O, but got Unknown
			//IL_1e1f: Unknown result type (might be due to invalid IL or missing references)
			//IL_1e29: Expected O, but got Unknown
			//IL_1e31: Unknown result type (might be due to invalid IL or missing references)
			//IL_1e3b: Expected O, but got Unknown
			instance = this;
			PInfo = ((BaseUnityPlugin)this).Info;
			Assets.LoadAssetBundlesFromFolder("assetbundles");
			Settings.Setup();
			AnimationClipParams val = new AnimationClipParams();
			val.animationClip = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/Breakin.anim") };
			val.looping = false;
			val._primaryAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("assets/compressedaudio/breakin'.ogg") };
			val.dimWhenClose = true;
			val.syncAnim = true;
			val.syncAudio = true;
			val.lockType = (LockType)1;
			val._primaryDMCAFreeAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("assets/DMCAMusic/Breakin'_NNTranscription.ogg") };
			CustomEmotesAPI.AddCustomAnimation(val);
			AddAnimation("Breakneck", (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("assets/compressedaudio/Breakneck.ogg") }, null, looping: true, dimAudio: true, sync: true, (LockType)1, "", (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("assets/compressedaudio/Breakneck.ogg") }, null, DMCA: false, 0.7f);
			AddAnimation("Crabby", "Crabby", "", looping: true, dimAudio: true, sync: true, (LockType)3, "", "Crabby", "", DMCA: false, 0.7f);
			AddAnimation("Dabstand", "Dabstand", "", looping: false, dimAudio: false, sync: false, (LockType)1, "", "Dabstand", "", DMCA: false, 0.05f);
			AddAnimation("DanceMoves", "Fortnite default dance sound", "", looping: false, dimAudio: true, sync: true, (LockType)1, "Default Dance", "Fortnite default dance sound", "", DMCA: false, 0.7f);
			AddAnimation("DanceTherapyIntro", "DanceTherapyLoop", "Dance Therapy Intro", "Dance Therapy Loop", looping: true, dimAudio: true, sync: true, (LockType)1, "Dance Therapy", "Dance Therapy Intro", "Dance Therapy Loop", DMCA: false, 0.7f);
			AddAnimation("DeepDab", "Dabstand", "", looping: false, dimAudio: false, sync: false, (LockType)3, "Deep Dab", "Dabstand", "", DMCA: false, 0.05f);
			AddAnimation("Droop", "Droop", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Droop", "", DMCA: false, 0.7f);
			AddAnimation("ElectroSwing", "ElectroSwing", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Electro Swing", "ElectroSwing", "", DMCA: false, 0.7f);
			AddAnimation("Extraterrestial", "Extraterestrial", "", looping: true, dimAudio: true, sync: true, (LockType)3, "", "Extraterestrial", "", DMCA: false, 0.7f);
			AddAnimation("FancyFeet", "FancyFeet", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Fancy Feet", "FancyFeet", "", DMCA: false, 0.7f);
			AddAnimation("FlamencoIntro", "FlamencoLoop", "Flamenco", "FlamencoLoop", looping: true, dimAudio: true, sync: true, (LockType)1, "Flamenco", "FlamencoLoop", "", DMCA: false, 0.7f);
			AddAnimation("Floss", "Floss", "", looping: true, dimAudio: true, sync: false, (LockType)3, "", "Floss", "", DMCA: false, 0.5f);
			AddAnimation("Fresh", "Fresh", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Fresh", "", DMCA: false, 0.7f);
			AddAnimation("Hype", "Hype", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Hype", "", DMCA: false, 0.7f);
			AddAnimation("Infectious", "Infectious", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Infectious", "", DMCA: false, 0.7f);
			AddAnimation("InfinidabIntro", "InfinidabLoop", "InfinidabIntro", "InfinidabLoop", looping: true, dimAudio: true, sync: false, (LockType)1, "Infinidab", "InfinidabLoop", "", DMCA: false, 0.1f);
			AddAnimation("NeverGonna", "Never Gonna Give you Up", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Never Gonna", "Never Gonna Give you Up", "", DMCA: true, 0.7f);
			AddAnimation("NinjaStyle", "NinjaStyle", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Ninja Style", "NinjaStyle", "", DMCA: false, 0.7f);
			AddAnimation("OldSchool", "Old School", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Oldschool", "Old School", "", DMCA: false, 0.7f);
			AddAnimation("OrangeJustice", "Orange Justice", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Orange Justice", "Orange Justice", "", DMCA: false, 0.6f);
			AddAnimation("Overdrive", "Overdrive", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Overdrive", "", DMCA: false, 0.7f);
			AddAnimation("PawsAndClaws", "im a cat", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Paws and Claws", "im a cat", "", DMCA: false, 0.7f);
			AddAnimation("PhoneItIn", "Phone It In", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Phone It In", "Phone It In", "", DMCA: false, 0.7f);
			AddAnimation("PopLock", "PopLock", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Pop Lock", "PopLock", "", DMCA: false, 0.7f);
			AddAnimation("Scenario", "Scenario", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Scenario", "", DMCA: false, 0.7f);
			AddAnimation("SpringLoaded", "SpringLoaded", "", looping: true, dimAudio: false, sync: false, (LockType)1, "Spring Loaded", "SpringLoaded", "", DMCA: false, 0.1f);
			AddAnimation("Springy", "Springy", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Springy", "", DMCA: false, 0.7f);
			AddAnimation("AnkhaZone", "AnkhaZone", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "AnkhaZone", "", DMCA: true, 0.7f);
			AddAnimation("GangnamStyle", "GangnamStyle", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Gangnam Style", "GangnamStyle", "", DMCA: true, 0.7f);
			AddAnimation("DontStart", "DontStart", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Don't Start", "DontStart", "", DMCA: true, 0.7f);
			AddAnimation("BunnyHop", "BunnyHop", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Bunny Hop", "BunnyHop", "", DMCA: false, 0.4f);
			AddAnimation("BestMates", "BestMates", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Best Mates", "BestMates", "", DMCA: false, 0.7f);
			AddAnimation("JackOPose", "", "", looping: true, dimAudio: false, sync: false, (LockType)1, "Jack-O Crouch", "", "", DMCA: false, 0f);
			AddAnimation("Crackdown", "Crackdown", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Crackdown", "", DMCA: false, 0.7f);
			AddAnimation("Thicc", "Thicc", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Thicc", "", DMCA: false, 0.7f);
			AddAnimation("TakeTheL", "TakeTheL", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Take The L", "TakeTheL", "", DMCA: false, 0.8f);
			AddAnimation("LetsDanceBoys", "LetsDanceBoys", "", looping: true, dimAudio: true, sync: true, (LockType)3, "Let's Dance Boys", "LetsDanceBoys", "", DMCA: false, 0.7f);
			AddAnimation("BlindingLightsIntro", "BlindingLights", "BlindingLightsIntro", "BlindingLightsLoop", looping: true, dimAudio: true, sync: true, (LockType)1, "Blinding Lights", "BlindingLightsIntro", "BlindingLightsLoop", DMCA: true, 0.7f);
			AddAnimation("ImDiamond", "ImDiamond", "", looping: true, dimAudio: true, sync: true, (LockType)1, "I'm Diamond", "ImDiamond", "", DMCA: true, 0.7f);
			AddAnimation("ItsDynamite", "ItsDynamite", "", looping: true, dimAudio: true, sync: true, (LockType)1, "It's Dynamite", "ItsDynamite", "", DMCA: true, 0.7f);
			AddAnimation("TheRobot", "TheRobot", "", looping: true, dimAudio: true, sync: true, (LockType)1, "The Robot", "TheRobot", "", DMCA: false, 0.7f);
			AddAnimation("Cartwheelin", "Cartwheelin", "", looping: true, dimAudio: false, sync: false, (LockType)1, "", "Cartwheelin", "", DMCA: false, 0.1f);
			AddAnimation("CrazyFeet", "CrazyFeet", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Crazy Feet", "CrazyFeet", "", DMCA: false, 0.7f);
			AddAnimation("FullTilt", "FullTilt", "", looping: true, dimAudio: true, sync: true, (LockType)3, "Full Tilt", "FullTilt", "", DMCA: false, 0.1f);
			AddAnimation("FloorSamus", "", "", looping: true, dimAudio: false, sync: false, (LockType)3, "Samus Crawl", "", "", DMCA: false, 0f);
			AddAnimation("DEDEDE", "", "", looping: true, dimAudio: false, sync: false, (LockType)1, "", "", "", DMCA: false, 0f);
			AddAnimation("Specialist", "Specialist", "", looping: false, dimAudio: true, sync: true, (LockType)3, "The Specialist", "Specialist", "", DMCA: false, 0.7f);
			AddStartAndJoinAnim(new string[2] { "PPmusic", "PPmusicFollow" }, "PPmusic", looping: true, dimaudio: true, sync: true, (LockType)1, "Penis Music", "PPmusic", DMCA: false, 0.7f);
			AddAnimation("GetDown", "GetDown", "", looping: false, dimAudio: true, sync: true, (LockType)3, "Get Down", "GetDown", "", DMCA: true, 0.7f);
			AddAnimation("Yakuza", "Yakuza", "", looping: true, dimAudio: true, sync: true, (LockType)3, "Koi no Disco Queen", "Yakuza", "", DMCA: false, 0.7f);
			AddAnimation("Miku", "Miku", "", looping: true, dimAudio: true, sync: true, (LockType)3, "", "Miku", "", DMCA: false, 0.7f);
			AddAnimation("Horny", new string[2] { "Horny", "TeddyLoid - ME!ME!ME! feat. Daoko" }, looping: true, dimaudio: true, sync: true, (LockType)1, "", new string[2] { "Horny", "TeddyLoid - ME!ME!ME! feat. Daoko" }, DMCA: true, 0.7f);
			AddAnimation("GangTorture", "GangTorture", "", looping: false, dimAudio: true, sync: true, (LockType)3, "", "GangTorture", "", DMCA: true, 0.7f);
			AddAnimation("PoseBurter", "GinyuForce", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Burter Pose", "GinyuForce", "", DMCA: false, 0.7f);
			AddAnimation("PoseGinyu", "GinyuForce", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Ginyu Pose", "GinyuForce", "", DMCA: false, 0.7f);
			AddAnimation("PoseGuldo", "GinyuForce", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Guldo Pose", "GinyuForce", "", DMCA: false, 0.7f);
			AddAnimation("PoseJeice", "GinyuForce", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Jeice Pose", "GinyuForce", "", DMCA: false, 0.7f);
			AddAnimation("PoseRecoome", "GinyuForce", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Recoome Pose", "GinyuForce", "", DMCA: false, 0.7f);
			AddAnimation("Carson", "Carson", "", looping: false, dimAudio: true, sync: true, (LockType)1, "", "Carson", "", DMCA: true, 0.7f);
			AddAnimation("Frolic", "Frolic", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Frolic", "", DMCA: false, 0.7f);
			AddAnimation("MoveIt", "MoveIt", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Move It", "MoveIt", "", DMCA: true, 0.7f);
			AddStartAndJoinAnim(new string[2] { "ByTheFireLead", "ByTheFirePartner" }, "ByTheFire", looping: true, dimaudio: true, sync: true, (LockType)1, "By The Fire", "ByTheFire", DMCA: true, 0.7f);
			AddStartAndJoinAnim(new string[2] { "SwayLead", "SwayPartner" }, "Sway", looping: true, dimaudio: true, sync: true, (LockType)1, "Sway", "Sway", DMCA: true, 0.7f);
			AddAnimation("Macarena", "Macarena", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Macarena", "", DMCA: true, 0.7f);
			AddAnimation("Thanos", "Thanos", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Thanos", "", DMCA: true, 0.7f);
			AddAnimation("StarGet", (AudioClip[])(object)new AudioClip[6]
			{
				Assets.Load<AudioClip>("assets/compressedaudio/starget2.ogg"),
				Assets.Load<AudioClip>("assets/compressedaudio/starget3.ogg"),
				Assets.Load<AudioClip>("assets/compressedaudio/starget4.ogg"),
				Assets.Load<AudioClip>("assets/compressedaudio/starget5.ogg"),
				Assets.Load<AudioClip>("assets/compressedaudio/starget6.ogg"),
				Assets.Load<AudioClip>("assets/compressedaudio/starget7.ogg")
			}, null, looping: false, dimAudio: false, sync: false, (LockType)3, "Star Get", (AudioClip[])(object)new AudioClip[6]
			{
				Assets.Load<AudioClip>("assets/DMCAMusic/starget2_NNTranscription.ogg"),
				Assets.Load<AudioClip>("assets/DMCAMusic/starget3_NNTranscription.ogg"),
				Assets.Load<AudioClip>("assets/DMCAMusic/starget4_NNTranscription.ogg"),
				Assets.Load<AudioClip>("assets/DMCAMusic/starget5_NNTranscription.ogg"),
				Assets.Load<AudioClip>("assets/DMCAMusic/starget6_NNTranscription.ogg"),
				Assets.Load<AudioClip>("assets/DMCAMusic/starget7_NNTranscription.ogg")
			}, null, DMCA: false, 0.6f);
			AddAnimation("Poyo", "Poyo", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Poyo", "", DMCA: false, 0.7f);
			AddAnimation("Chika", "Chika", "", looping: false, dimAudio: true, sync: true, (LockType)3, "", "Chika", "", DMCA: true, 0.7f);
			AddAnimation("Goopie", "Goopie", "", looping: false, dimAudio: true, sync: true, (LockType)1, "", "Goopie", "", DMCA: true, 0.7f);
			AddAnimation("Crossbounce", "Crossbounce", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Crossbounce", "", DMCA: false, 0.7f);
			AddAnimation("Butt", "Butt", "", looping: false, dimAudio: false, sync: false, (LockType)2, "", "Butt", "", DMCA: false, 0.5f);
			AddAnimation("MakeItRainIntro", "MakeItRainLoop", "MakeItRainIntro", "MakeItRainLoop", looping: true, dimAudio: true, sync: true, (LockType)3, "Make it Rain", "MakeItRainLoop", "", DMCA: true, 0.7f);
			AddAnimation("Penguin", "Penguin", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Club Penguin", "Penguin", "", DMCA: false, 0.4f);
			AddAnimation("DesertRivers", "DesertRivers", "", looping: false, dimAudio: true, sync: true, (LockType)3, "Rivers in the Dessert", "DesertRivers", "", DMCA: false, 0.7f);
			AddAnimation("HondaStep", "HondaStep", "", looping: false, dimAudio: true, sync: true, (LockType)3, "Step!", "HondaStep", "", DMCA: true, 0.7f);
			AddAnimation("UGotThat", "UGotThat", "", looping: false, dimAudio: true, sync: true, (LockType)3, "U Got That", "UGotThat", "", DMCA: true, 0.7f);
			AddAnimation("OfficerEarl", "", "", looping: true, dimAudio: false, sync: false, (LockType)3, "Officer Earl", "", "", DMCA: false, 0f);
			AddAnimation("Cirno", "Cirno", "", looping: false, dimAudio: true, sync: true, (LockType)3, "", "Cirno", "", DMCA: false, 0.7f);
			AnimationClipParams val2 = new AnimationClipParams();
			val2.animationClip = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/Haruhi.anim") };
			val2.looping = false;
			val2._primaryAudioClips = (AudioClip[])(object)new AudioClip[2]
			{
				Assets.Load<AudioClip>("assets/compressedaudio/Haruhi.ogg"),
				Assets.Load<AudioClip>("assets/compressedaudio/HaruhiYoung.ogg")
			};
			val2.dimWhenClose = true;
			val2.syncAnim = true;
			val2.syncAudio = true;
			val2.startPref = 0;
			val2.joinPref = 0;
			val2.joinSpots = (JoinSpot[])(object)new JoinSpot[2]
			{
				new JoinSpot("Yuki_Nagato", new Vector3(1.5f, 0f, -1.5f)),
				new JoinSpot("Mikuru_Asahina", new Vector3(-1.5f, 0f, -1.5f))
			};
			val2.customName = "Hare Hare Yukai";
			val2.lockType = (LockType)3;
			val2.willGetClaimedByDMCA = true;
			val2._primaryDMCAFreeAudioClips = (AudioClip[])(object)new AudioClip[2]
			{
				Assets.Load<AudioClip>("assets/DMCAMusic/Haruhi_NNTranscription.ogg"),
				Assets.Load<AudioClip>("assets/DMCAMusic/HaruhiYoung_NNTranscription.ogg")
			};
			val2.audioLevel = 0.7f;
			CustomEmotesAPI.AddCustomAnimation(val2);
			val2 = new AnimationClipParams();
			val2.animationClip = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/Yuki_Nagato.anim") };
			val2.looping = false;
			val2.syncAnim = true;
			val2.visible = false;
			val2.lockType = (LockType)2;
			val2.audioLevel = 0f;
			CustomEmotesAPI.AddCustomAnimation(val2);
			val2 = new AnimationClipParams();
			val2.animationClip = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/Mikuru_Asahina.anim") };
			val2.looping = false;
			val2.syncAnim = true;
			val2.visible = false;
			val2.lockType = (LockType)2;
			val2.audioLevel = 0f;
			CustomEmotesAPI.AddCustomAnimation(val2);
			BoneMapper.animClips["Yuki_Nagato"].vulnerableEmote = true;
			BoneMapper.animClips["Mikuru_Asahina"].vulnerableEmote = true;
			val2 = new AnimationClipParams();
			val2.animationClip = (AnimationClip[])(object)new AnimationClip[3]
			{
				Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/GGGG.anim"),
				Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/GGGG2.anim"),
				Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/GGGG3.anim")
			};
			val2.looping = false;
			val2._primaryAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("assets/compressedaudio/GGGG.ogg") };
			val2.dimWhenClose = true;
			val2.syncAnim = true;
			val2.syncAudio = true;
			val2.startPref = -2;
			val2.joinPref = -2;
			val2.lockType = (LockType)3;
			val2.willGetClaimedByDMCA = true;
			val2._primaryDMCAFreeAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("assets/DMCAMusic/GGGG_NNTranscription.ogg") };
			val2.audioLevel = 0.7f;
			CustomEmotesAPI.AddCustomAnimation(val2);
			AddAnimation("Shufflin", "Shufflin", "", looping: false, dimAudio: true, sync: true, (LockType)3, "", "Shufflin", "", DMCA: true, 0.7f);
			AddAnimation("BimBamBom", "BimBamBom", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Bim Bam Boom", "BimBamBom", "", DMCA: true, 0.7f);
			AddAnimation("Savage", "Savage", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Savage", "", DMCA: true, 0.7f);
			AddAnimation("Stuck", "Stuck", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Stuck", "", DMCA: true, 0.7f);
			AddAnimation("Roflcopter", "Roflcopter", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Roflcopter", "", DMCA: false, 0.7f);
			AddAnimation("Float", "Float", "", looping: false, dimAudio: true, sync: true, (LockType)1, "", "Float", "", DMCA: false, 0.4f);
			AddAnimation("Rollie", "Rollie", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Rollie", "", DMCA: true, 0.7f);
			AddAnimation("GalaxyObservatory", new string[3] { "GalaxyObservatory1", "GalaxyObservatory2", "GalaxyObservatory3" }, looping: true, dimaudio: true, sync: true, (LockType)3, "Galaxy Observatory", new string[3] { "GalaxyObservatory1", "GalaxyObservatory2", "GalaxyObservatory3" }, DMCA: false, 0.5f);
			AddAnimation("Markiplier", "Markiplier", "", looping: false, dimAudio: false, sync: false, (LockType)3, "", "Markiplier", "", DMCA: true, 0.6f);
			AddAnimation("DevilSpawn", "DevilSpawn", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "DevilSpawn", "", DMCA: true, 0.7f);
			val2 = new AnimationClipParams();
			val2.animationClip = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/DuckThisOneIdle.anim") };
			val2.looping = true;
			val2._primaryAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("assets/compressedaudio/DuckThisOneIdle.ogg") };
			val2.joinSpots = (JoinSpot[])(object)new JoinSpot[1]
			{
				new JoinSpot("DuckThisJoinSpot", new Vector3(0f, 0f, 2f))
			};
			val2.dimWhenClose = true;
			val2.lockType = (LockType)2;
			val2.customName = "Duck This One";
			val2._primaryDMCAFreeAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("assets/DMCAMusic/DuckThisOneIdle_NNTranscription.ogg") };
			val2.willGetClaimedByDMCA = false;
			val2.audioLevel = 0.7f;
			CustomEmotesAPI.AddCustomAnimation(val2);
			val2 = new AnimationClipParams();
			val2.animationClip = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/DuckThisOne.anim") };
			val2.looping = false;
			val2._primaryAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("assets/compressedaudio/DuckThisOne.ogg") };
			val2.visible = false;
			val2.dimWhenClose = true;
			val2.lockType = (LockType)2;
			val2._primaryDMCAFreeAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("assets/compressedaudio/DuckThisOne.ogg") };
			CustomEmotesAPI.AddCustomAnimation(val2);
			val2 = new AnimationClipParams();
			val2.animationClip = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/DuckThisOneJoin.anim") };
			val2.looping = false;
			val2.visible = false;
			val2.dimWhenClose = true;
			val2.lockType = (LockType)2;
			CustomEmotesAPI.AddCustomAnimation(val2);
			BoneMapper.animClips["DuckThisOneIdle"].vulnerableEmote = true;
			BoneMapper.animClips["DuckThisOne"].vulnerableEmote = true;
			BoneMapper.animClips["DuckThisOneJoin"].vulnerableEmote = true;
			AddAnimation("Griddy", "Griddy", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Griddy", "", DMCA: true, 0.7f);
			AddAnimation("Tidy", "Tidy", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Tidy", "", DMCA: true, 0.7f);
			AddAnimation("Toosie", "Toosie", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Toosie", "", DMCA: true, 0.7f);
			AddAnimation("INEEDAMEDICBAG", (AudioClip[])(object)new AudioClip[2]
			{
				Assets.Load<AudioClip>("assets/compressedaudio/INEEDAMEDICBAG1.ogg"),
				Assets.Load<AudioClip>("assets/compressedaudio/INEEDAMEDICBAG2.ogg")
			}, null, looping: false, dimAudio: false, sync: false, (LockType)3, "I NEED A MEDIC BAG", (AudioClip[])(object)new AudioClip[2]
			{
				Assets.Load<AudioClip>("assets/compressedaudio/INEEDAMEDICBAG1.ogg"),
				Assets.Load<AudioClip>("assets/compressedaudio/INEEDAMEDICBAG2.ogg")
			}, null, DMCA: false, 0.9f);
			AddAnimation("Smoke", "Smoke", "", looping: true, dimAudio: true, sync: true, (LockType)3, "Ralsei Dies", "Smoke", "", DMCA: false, 0.7f);
			AddAnimation("FamilyGuyDeath", "", "", looping: true, dimAudio: false, sync: false, (LockType)1, "Family Guy Death Pose", "", "", DMCA: false, 0f);
			AddAnimation("Panda", "", "", looping: false, dimAudio: false, sync: false, (LockType)3, "", "", "", DMCA: false, 0f);
			AddAnimation("Yamcha", "", "", looping: true, dimAudio: false, sync: false, (LockType)1, "Yamcha Death Pose", "", "", DMCA: false, 0f);
			AddAnimation("Thriller", "Thriller", "", looping: true, dimAudio: true, sync: true, (LockType)3, "", "Thriller", "", DMCA: true, 0.7f);
			AddAnimation("Wess", "Wess", "", looping: false, dimAudio: true, sync: true, (LockType)1, "", "Wess", "", DMCA: true, 0.7f);
			AddAnimation("Distraction", "Distraction", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Distraction Dance", "Distraction", "", DMCA: false, 1f);
			AddAnimation("Security", "Security", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Last Surprise", "Security", "", DMCA: false, 0.7f);
			AddAnimation("KillMeBaby", "KillMeBaby", "", looping: false, dimAudio: true, sync: true, (LockType)1, "Kill Me Baby", "KillMeBaby", "", DMCA: true, 0.7f);
			val2 = new AnimationClipParams();
			val2.animationClip = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/MyWorld.anim") };
			val2.looping = true;
			val2._primaryAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("assets/compressedaudio/MyWorld.ogg") };
			val2.dimWhenClose = true;
			val2.syncAnim = true;
			val2.syncAudio = true;
			val2.joinSpots = (JoinSpot[])(object)new JoinSpot[1]
			{
				new JoinSpot("MyWorldJoinSpot", new Vector3(2f, 0f, 0f))
			};
			val2.lockType = (LockType)1;
			val2._primaryDMCAFreeAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("assets/DMCAMusic/MyWorld_NNTranscription.ogg") };
			val2.audioLevel = 0.7f;
			val2.willGetClaimedByDMCA = true;
			CustomEmotesAPI.AddCustomAnimation(val2);
			val2 = new AnimationClipParams();
			val2.animationClip = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/MyWorldJoin.anim") };
			val2.looping = true;
			val2._primaryAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("assets/compressedaudio/MyWorld.ogg") };
			val2.dimWhenClose = true;
			val2.syncAnim = true;
			val2.syncAudio = true;
			val2.visible = false;
			val2.lockType = (LockType)1;
			val2.audioLevel = 0f;
			val2._primaryDMCAFreeAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("assets/DMCAMusic/MyWorld_NNTranscription.ogg") };
			val2.willGetClaimedByDMCA = true;
			CustomEmotesAPI.AddCustomAnimation(val2);
			CustomAnimationClip obj = BoneMapper.animClips["MyWorldJoin"];
			obj.syncPos--;
			BoneMapper.animClips["MyWorldJoin"].vulnerableEmote = true;
			val2 = new AnimationClipParams();
			val2.animationClip = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/VSWORLD.anim") };
			val2.looping = true;
			val2._primaryAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("assets/compressedaudio/VSWORLD.ogg") };
			val2.dimWhenClose = true;
			val2.syncAnim = true;
			val2.syncAudio = true;
			val2.joinSpots = (JoinSpot[])(object)new JoinSpot[1]
			{
				new JoinSpot("VSWORLDJoinSpot", new Vector3(-2f, 0f, 0f))
			};
			val2.lockType = (LockType)1;
			val2._primaryDMCAFreeAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("assets/DMCAMusic/VSWORLD_NNTranscription.ogg") };
			val2.audioLevel = 0.7f;
			CustomEmotesAPI.AddCustomAnimation(val2);
			val2 = new AnimationClipParams();
			val2.animationClip = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/VSWORLDLEFT.anim") };
			val2.looping = true;
			val2._primaryAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("assets/compressedaudio/VSWORLD.ogg") };
			val2.dimWhenClose = true;
			val2.syncAnim = true;
			val2.syncAudio = true;
			val2.visible = false;
			val2.lockType = (LockType)1;
			val2._primaryDMCAFreeAudioClips = (AudioClip[])(object)new AudioClip[1] { Assets.Load<AudioClip>("assets/DMCAMusic/VSWORLD_NNTranscription.ogg") };
			CustomEmotesAPI.AddCustomAnimation(val2);
			CustomAnimationClip obj2 = BoneMapper.animClips["VSWORLDLEFT"];
			obj2.syncPos--;
			BoneMapper.animClips["VSWORLDLEFT"].vulnerableEmote = true;
			val2 = new AnimationClipParams();
			val2.animationClip = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/ChugJug.anim") };
			val2.looping = false;
			val2._primaryAudioClips = (AudioClip[])(object)new AudioClip[2]
			{
				Assets.Load<AudioClip>("assets/compressedaudio/ChugJug.ogg"),
				Assets.Load<AudioClip>("assets/compressedaudio/MikuJug.ogg")
			};
			val2.dimWhenClose = true;
			val2.syncAnim = true;
			val2.syncAudio = true;
			val2.lockType = (LockType)1;
			val2._primaryDMCAFreeAudioClips = (AudioClip[])(object)new AudioClip[2]
			{
				Assets.Load<AudioClip>("assets/DMCAMusic/ChugJug_NNTranscription.ogg"),
				Assets.Load<AudioClip>("assets/DMCAMusic/MikuJug_NNTranscription.ogg")
			};
			val2.audioLevel = 0.7f;
			CustomEmotesAPI.AddCustomAnimation(val2);
			AddAnimation("Summertime", "Summertime", "", looping: false, dimAudio: true, sync: true, (LockType)1, "", "Summertime", "", DMCA: true, 0.7f);
			AddAnimation("Dougie", "Dougie", "", looping: true, dimAudio: true, sync: true, (LockType)1, "", "Dougie", "", DMCA: true, 0.7f);
			AddAnimation("CaliforniaGirls", "CaliforniaGirls", "", looping: true, dimAudio: true, sync: true, (LockType)1, "California Gurls", "CaliforniaGirls", "", DMCA: true, 0.7f);
			AddAnimation("SeeTinh", "SeeTinh", "", looping: false, dimAudio: true, sync: true, (LockType)1, "See Tình", "SeeTinh", "", DMCA: true, 0.7f);
			AddAnimation("VirtualInsanityIntro", "VirtualInsanityLoop", "VirtualInsanityStart", "VirtualInsanityLoop", looping: false, dimAudio: true, sync: true, (LockType)1, "Virtual Insanity", "VirtualInsanityStart", "VirtualInsanityLoop", DMCA: true, 0.5f);
			AddAnimation("Im a Mystery", "Im a Mystery Loop", "Im a Mystery", "Im a Mystery Loop", looping: true, dimAudio: true, sync: true, (LockType)1, "Im a Mystery", "Im a Mystery", "Im a Mystery Loop", DMCA: true, 0.5f);
			AddAnimation("Bird", "Bird", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Bird", "Bird", "", DMCA: false, 0.7f);
			AddAnimation("Real Slim Shady", "Real Slim Shady Loop", "Real Slim Shady", "Real Slim Shady Loop", looping: true, dimAudio: true, sync: true, (LockType)1, "Real Slim Shady", "Real Slim Shady", "Real Slim Shady Loop", DMCA: true, 0.7f);
			AddAnimation("Steady", "Steady", "", looping: true, dimAudio: true, sync: true, (LockType)1, "Steady", "Steady", "", DMCA: false, 0.7f);
			CustomEmotesAPI.animChanged += new AnimationChanged(CustomEmotesAPI_animChanged);
			CustomEmotesAPI.emoteSpotJoined_Body += new JoinedEmoteSpotBody(CustomEmotesAPI_emoteSpotJoined_Body);
			CustomEmotesAPI.emoteSpotJoined_Prop += new JoinedEmoteSpotProp(CustomEmotesAPI_emoteSpotJoined_Prop);
			CustomEmotesAPI.boneMapperCreated += new BoneMapperCreated(CustomEmotesAPI_boneMapperCreated);
		}

		private void CustomEmotesAPI_boneMapperCreated(BoneMapper mapper)
		{
		}

		private void CustomEmotesAPI_emoteSpotJoined_Prop(GameObject emoteSpot, BoneMapper joiner, BoneMapper host)
		{
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Expected O, but got Unknown
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Expected O, but got Unknown
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Expected O, but got Unknown
			//IL_010b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Expected O, but got Unknown
			switch (((Object)emoteSpot).name)
			{
			case "ifumiddle":
			{
				((Component)host).GetComponentsInChildren<Animator>()[1].SetTrigger("Start");
				joiner.PlayAnim("ifu", 0);
				GameObject val = new GameObject();
				((Object)val).name = "ifumiddle_JoinProp";
				IFU(joiner, host, emoteSpot, val);
				break;
			}
			case "ifeleft":
			{
				((Component)host).GetComponentsInChildren<Animator>()[1].SetTrigger("Start");
				joiner.PlayAnim("ifeleft", 0);
				GameObject val = new GameObject();
				((Object)val).name = "ifeleft_JoinProp";
				IFU(joiner, host, emoteSpot, val);
				break;
			}
			case "ifuright":
			{
				((Component)host).GetComponentsInChildren<Animator>()[1].SetTrigger("Start");
				joiner.PlayAnim("ifuright", 0);
				GameObject val = new GameObject();
				((Object)val).name = "ifuright_JoinProp";
				IFU(joiner, host, emoteSpot, val);
				break;
			}
			case "HydrolicPressJoinSpot":
			{
				GameObject val = new GameObject();
				((Object)val).name = "hydrolicpress_JoinProp";
				HydrolicPress(joiner, host, emoteSpot, val);
				break;
			}
			}
		}

		private void IFU(BoneMapper joiner, BoneMapper host, GameObject emoteSpot, GameObject g)
		{
		}

		private void HydrolicPress(BoneMapper joiner, BoneMapper host, GameObject emoteSpot, GameObject g)
		{
			//IL_0038: 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_005c: Unknown result type (might be due to invalid IL or missing references)
			joiner.props.Add(g);
			g.transform.SetParent(((Component)host).transform);
			g.transform.localPosition = new Vector3(0f, 0.03f, 0f);
			g.transform.localEulerAngles = Vector3.zero;
			g.transform.localScale = Vector3.one;
			g.AddComponent<HydrolicPressComponent>().boneMapper = joiner;
			joiner.AssignParentGameObject(g, true, false, true, false, false);
			emoteSpot.GetComponent<EmoteLocation>().SetEmoterAndHideLocation(joiner);
			((MonoBehaviour)this).StartCoroutine(WaitForSecondsThenEndEmote(joiner, 10f, g));
		}

		private IEnumerator WaitForSecondsThenEndEmote(BoneMapper mapper, float time, GameObject parent)
		{
			yield return (object)new WaitForSeconds(time);
			if (Object.op_Implicit((Object)(object)mapper) && (Object)(object)mapper.parentGameObject == (Object)(object)parent)
			{
				mapper.preserveProps = true;
				mapper.AssignParentGameObject(mapper.parentGameObject, false, false, true, false, false);
				mapper.preserveParent = true;
				mapper.preserveProps = true;
				mapper.PlayAnim("none", 0);
			}
		}

		internal IEnumerator WaitForSecondsThenDeleteGameObject(GameObject obj, float time)
		{
			yield return (object)new WaitForSeconds(time);
			if (Object.op_Implicit((Object)(object)obj))
			{
				Object.Destroy((Object)(object)obj);
			}
		}

		private void CustomEmotesAPI_emoteSpotJoined_Body(GameObject emoteSpot, BoneMapper joiner, BoneMapper host)
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Expected O, but got Unknown
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Expected O, but got Unknown
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_0155: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_0196: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dc: Expected O, but got Unknown
			//IL_0204: Unknown result type (might be due to invalid IL or missing references)
			//IL_021c: Unknown result type (might be due to invalid IL or missing references)
			//IL_022e: Unknown result type (might be due to invalid IL or missing references)
			//IL_030a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0311: Expected O, but got Unknown
			//IL_0345: Unknown result type (might be due to invalid IL or missing references)
			//IL_034a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0362: Unknown result type (might be due to invalid IL or missing references)
			//IL_0383: Unknown result type (might be due to invalid IL or missing references)
			//IL_0395: Unknown result type (might be due to invalid IL or missing references)
			//IL_046d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0474: Expected O, but got Unknown
			//IL_04a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_04e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_04f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0548: Unknown result type (might be due to invalid IL or missing references)
			//IL_054f: Expected O, but got Unknown
			//IL_0593: Unknown result type (might be due to invalid IL or missing references)
			//IL_05a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_05b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0607: Unknown result type (might be due to invalid IL or missing references)
			//IL_060e: Expected O, but got Unknown
			//IL_0634: Unknown result type (might be due to invalid IL or missing references)
			//IL_0639: Unknown result type (might be due to invalid IL or missing references)
			//IL_0646: Unknown result type (might be due to invalid IL or missing references)
			//IL_067f: Unknown result type (might be due to invalid IL or missing references)
			//IL_06a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_06b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_06c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_06da: Unknown result type (might be due to invalid IL or missing references)
			string name = ((Object)emoteSpot).name;
			if (name == "StandingHereJoinSpot")
			{
				joiner.PlayAnim("StandingHere", 0);
				GameObject val = new GameObject();
				((Object)val).name = "StandingHereProp";
				joiner.props.Add(val);
				val.transform.SetParent(((Component)host).transform);
				Vector3 lossyScale = ((Component)host).transform.lossyScale;
				val.transform.localPosition = new Vector3(0f, 0f, 0.75f / lossyScale.z);
				val.transform.localEulerAngles = new Vector3(0f, 130f, 0f);
				val.transform.localScale = new Vector3(0.8f, 0.8f, 0.8f);
				joiner.AssignParentGameObject(val, true, true, true, true, true);
				joiner.SetAnimationSpeed(2f);
				emoteSpot.GetComponent<EmoteLocation>().SetEmoterAndHideLocation(joiner);
			}
			if (name == "DuckThisJoinSpot")
			{
				joiner.PlayAnim("DuckThisOneJoin", 0);
				GameObject val2 = new GameObject();
				((Object)val2).name = "DuckThisOneJoinProp";
				joiner.props.Add(val2);
				val2.transform.SetParent(((Component)host).transform);
				Vector3 lossyScale2 = ((Component)host).transform.lossyScale;
				val2.transform.localPosition = new Vector3(0f, 0f, 1f / lossyScale2.z);
				val2.transform.localEulerAngles = new Vector3(0f, 180f, 0f);
				val2.transform.localScale = Vector3.one;
				joiner.AssignParentGameObject(val2, true, true, true, true, true);
				host.PlayAnim("DuckThisOne", 0);
				joiner.currentlyLockedBoneMapper = host;
				val2 = new GameObject();
				((Object)val2).name = "DuckThisOneHostProp";
				host.props.Add(val2);
				val2.transform.localPosition = ((Component)host).transform.position;
				val2.transform.localEulerAngles = ((Component)host).transform.eulerAngles;
				val2.transform.localScale = Vector3.one;
				val2.transform.SetParent(host.mapperBodyTransform.parent);
				host.AssignParentGameObject(val2, true, true, true, true, false);
			}
			if (name == "Yuki_Nagato")
			{
				joiner.PlayAnim("Yuki_Nagato", 0);
				CustomAnimationClip.syncTimer[joiner.currentClip.syncPos] = CustomAnimationClip.syncTimer[host.currentClip.syncPos];
				CustomAnimationClip.syncPlayerCount[joiner.currentClip.syncPos]++;
				joiner.PlayAnim("Yuki_Nagato", 0);
				CustomAnimationClip.syncPlayerCount[joiner.currentClip.syncPos]--;
				GameObject val3 = new GameObject();
				((Object)val3).name = "Yuki_NagatoProp";
				joiner.props.Add(val3);
				val3.transform.SetParent(((Component)host).transform);
				Vector3 lossyScale3 = ((Component)host).transform.lossyScale;
				val3.transform.localPosition = new Vector3(0f, 0f, 0f);
				val3.transform.localEulerAngles = new Vector3(0f, 0f, 0f);
				val3.transform.localScale = Vector3.one;
				joiner.AssignParentGameObject(val3, true, true, true, true, true);
				joiner.currentlyLockedBoneMapper = host;
				emoteSpot.GetComponent<EmoteLocation>().SetEmoterAndHideLocation(joiner);
			}
			if (name == "Mikuru_Asahina")
			{
				joiner.PlayAnim("Mikuru_Asahina", 0);
				CustomAnimationClip.syncTimer[joiner.currentClip.syncPos] = CustomAnimationClip.syncTimer[host.currentClip.syncPos];
				CustomAnimationClip.syncPlayerCount[joiner.currentClip.syncPos]++;
				joiner.PlayAnim("Mikuru_Asahina", 0);
				CustomAnimationClip.syncPlayerCount[joiner.currentClip.syncPos]--;
				GameObject val4 = new GameObject();
				((Object)val4).name = "Mikuru_AsahinaProp";
				joiner.props.Add(val4);
				val4.transform.SetParent(((Component)host).transform);
				Vector3 lossyScale4 = ((Component)host).transform.lossyScale;
				val4.transform.localPosition = new Vector3(0f, 0f, 0f);
				val4.transform.localEulerAngles = new Vector3(0f, 0f, 0f);
				val4.transform.localScale = Vector3.one;
				joiner.AssignParentGameObject(val4, true, true, true, true, true);
				joiner.currentlyLockedBoneMapper = host;
				emoteSpot.GetComponent<EmoteLocation>().SetEmoterAndHideLocation(joiner);
			}
			if (name == "MyWorldJoinSpot")
			{
				joiner.PlayAnim("MyWorldJoin", 0);
				GameObject val5 = new GameObject();
				((Object)val5).name = "MyWorldJoinProp";
				joiner.props.Add(val5);
				val5.transform.SetParent(((Component)host).transform);
				val5.transform.localPosition = new Vector3(2f, 0f, 0f);
				val5.transform.localEulerAngles = Vector3.zero;
				val5.transform.localScale = Vector3.one;
				joiner.AssignParentGameObject(val5, true, true, true, true, true);
				joiner.currentlyLockedBoneMapper = host;
				emoteSpot.GetComponent<EmoteLocation>().SetEmoterAndHideLocation(joiner);
			}
			if (name == "VSWORLDJoinSpot")
			{
				joiner.PlayAnim("VSWORLDLEFT", 0);
				GameObject val6 = new GameObject();
				((Object)val6).name = "VSWORLDLEFTJoinProp";
				joiner.props.Add(val6);
				Vector3 localScale = ((Component)host).transform.parent.localScale;
				((Component)host).transform.parent.localScale = Vector3.one;
				val6.transform.SetParent(((Component)host).transform.parent);
				val6.transform.localPosition = new Vector3(-2f, 0f, 0f);
				val6.transform.localEulerAngles = new Vector3(90f, 0f, 0f);
				val6.transform.localScale = Vector3.one * (host.scale / joiner.scale);
				((Component)host).transform.parent.localScale = localScale;
				joiner.AssignParentGameObject(val6, true, true, false, false, true);
				joiner.currentlyLockedBoneMapper = host;
				emoteSpot.GetComponent<EmoteLocation>().SetEmoterAndHideLocation(joiner);
			}
		}

		private void CustomEmotesAPI_animChanged(string newAnimation, BoneMapper mapper)
		{
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Expected O, but got Unknown
			//IL_00c7: 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_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0258: Unknown result type (might be due to invalid IL or missing references)
			//IL_0279: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_032f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0350: Unknown result type (might be due to invalid IL or missing references)
			//IL_044e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0460: Unknown result type (might be due to invalid IL or missing references)
			//IL_052d: Unknown result type (might be due to invalid IL or missing references)
			//IL_054e: Unknown result type (might be due to invalid IL or missing references)
			//IL_081d: Unknown result type (might be due to invalid IL or missing references)
			//IL_083e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0639: Unknown result type (might be due to invalid IL or missing references)
			//IL_065a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0770: Unknown result type (might be due to invalid IL or missing references)
			//IL_0791: Unknown result type (might be due to invalid IL or missing references)
			//IL_0954: Unknown result type (might be due to invalid IL or missing references)
			//IL_0975: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a3d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a44: Expected O, but got Unknown
			//IL_0a6c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a84: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a98: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a9d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0aaf: Unknown result type (might be due to invalid IL or missing references)
			//IL_0cd3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0cda: Expected O, but got Unknown
			//IL_0d02: Unknown result type (might be due to invalid IL or missing references)
			//IL_0d1a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0d2c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c24: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c45: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c8f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c94: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ddf: Unknown result type (might be due to invalid IL or missing references)
			//IL_0e00: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f57: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f78: Unknown result type (might be due to invalid IL or missing references)
			prop1 = -1;
			try
			{
				if (newAnimation != "none")
				{
					stand = mapper.currentClip.syncPos;
				}
			}
			catch (Exception)
			{
			}
			if (punchingMappers.Contains(mapper))
			{
				punchingMappers.Remove(mapper);
			}
			if (punchingMappers.Count == 0)
			{
			}
			if (newAnimation == "StandingHere")
			{
				punchingMappers.Add(mapper);
			}
			if (newAnimation == "StoodHere")
			{
				GameObject val = new GameObject();
				((Object)val).name = "StoodHereProp";
				mapper.props.Add(val);
				val.transform.localPosition = ((Component)mapper).transform.position;
				val.transform.localEulerAngles = ((Component)mapper).transform.eulerAngles;
				val.transform.localScale = Vector3.one;
				mapper.AssignParentGameObject(val, false, false, true, true, false);
			}
			if (newAnimation == "Chika")
			{
				prop1 = mapper.props.Count;
				GameObject val2 = ((Random.Range(0, 100) != 0) ? Assets.Load<GameObject>("@BadAssEmotes_badassemotes:assets/prefabs/CSSDesker.prefab") : Assets.Load<GameObject>("@BadAssEmotes_badassemotes:assets/models/desker.prefab"));
				mapper.props.Add(Object.Instantiate<GameObject>(val2));
				mapper.props[prop1].transform.SetParent(((Component)mapper).transform);
				mapper.props[prop1].transform.localEulerAngles = Vector3.zero;
				mapper.props[prop1].transform.localPosition = Vector3.zero;
				mapper.ScaleProps();
			}
			if (newAnimation == "MakeItRainIntro")
			{
				prop1 = mapper.props.Count;
				mapper.props.Add(Object.Instantiate<GameObject>(Assets.Load<GameObject>("@BadAssEmotes_badassemotes:assets/Prefabs/money.prefab")));
				mapper.props[prop1].transform.SetParent(((Component)mapper).transform);
				mapper.props[prop1].transform.localEulerAngles = Vector3.zero;
				mapper.props[prop1].transform.localPosition = Vector3.zero;
				mapper.ScaleProps();
			}
			switch (newAnimation)
			{
			default:
				if (!(newAnimation == "GGGG"))
				{
					break;
				}
				goto case "DesertRivers";
			case "DesertRivers":
			case "Cirno":
			case "Haruhi":
				prop1 = mapper.props.Count;
				mapper.props.Add(Object.Instantiate<GameObject>(Assets.Load<GameObject>("@BadAssEmotes_badassemotes:assets/Prefabs/desertlight.prefab")));
				mapper.props[prop1].transform.SetParent(((Component)mapper).transform);
				mapper.props[prop1].transform.localEulerAngles = Vector3.zero;
				mapper.props[prop1].transform.localPosition = Vector3.zero;
				break;
			}
			if (newAnimation == "HondaStep")
			{
				prop1 = mapper.props.Count;
				GameObject val3 = Object.Instantiate<GameObject>(Assets.Load<GameObject>("@BadAssEmotes_badassemotes:assets/Prefabs/hondastuff.prefab"));
				ParticleSystem[] componentsInChildren = val3.GetComponentsInChildren<ParticleSystem>();
				foreach (ParticleSystem val4 in componentsInChildren)
				{
					val4.time = CustomAnimationClip.syncTimer[mapper.currentClip.syncPos];
				}
				Animator componentInChildren = val3.GetComponentInChildren<Animator>();
				componentInChildren.Play("MusicSync", 0, CustomAnimationClip.syncTimer[mapper.currentClip.syncPos] % ((AnimatorClipInfo)(ref componentInChildren.GetCurrentAnimatorClipInfo(0)[0])).clip.length / ((AnimatorClipInfo)(ref componentInChildren.GetCurrentAnimatorClipInfo(0)[0])).clip.length);
				val3.transform.SetParent(((Component)mapper).transform);
				val3.transform.localEulerAngles = Vector3.zero;
				val3.transform.localPosition = Vector3.zero;
				mapper.props.Add(val3);
			}
			if (newAnimation == "Train")
			{
				prop1 = mapper.props.Count;
				if (CustomAnimationClip.syncPlayerCount[stand] == 1)
				{
					mapper.props.Add(Object.Instantiate<GameObject>(Assets.Load<GameObject>("@BadAssEmotes_badassemotes:assets/Prefabs/train.prefab")));
				}
				else
				{
					mapper.props.Add(Object.Instantiate<GameObject>(Assets.Load<GameObject>("@BadAssEmotes_badassemotes:assets/Prefabs/passenger.prefab")));
				}
				mapper.props[prop1].transform.SetParent(((Component)mapper).transform);
				mapper.props[prop1].transform.localEulerAngles = Vector3.zero;
				mapper.props[prop1].transform.localPosition = Vector3.zero;
				mapper.SetAutoWalk(1f, false);
				mapper.ScaleProps();
			}
			if (newAnimation == "BimBamBom")
			{
				prop1 = mapper.props.Count;
				mapper.props.Add(Object.Instantiate<GameObject>(Assets.Load<GameObject>("@BadAssEmotes_badassemotes:assets/Prefabs/BimBamBom.prefab")));
				ParticleSystem[] componentsInChildren2 = mapper.props[prop1].GetComponentsInChildren<ParticleSystem>();
				foreach (ParticleSystem val5 in componentsInChildren2)
				{
					val5.time = CustomAnimationClip.syncTimer[mapper.currentClip.syncPos];
				}
				mapper.props[prop1].transform.SetParent(((Component)mapper).transform);
				mapper.props[prop1].transform.localEulerAngles = Vector3.zero;
				mapper.props[prop1].transform.localPosition = Vector3.zero;
				mapper.ScaleProps();
			}
			if (newAnimation == "Summertime")
			{
				prop1 = mapper.props.Count;
				mapper.props.Add(Object.Instantiate<GameObject>(Assets.Load<GameObject>("@BadAssEmotes_badassemotes:Assets/Prefabs/Summermogus.prefab")));
				Animator[] componentsInChildren3 = mapper.props[prop1].GetComponentsInChildren<Animator>();
				foreach (Animator val6 in componentsInChildren3)
				{
					val6.Play("Summertime", 0, CustomAnimationClip.syncTimer[mapper.currentClip.syncPos] % ((AnimatorClipInfo)(ref val6.GetCurrentAnimatorClipInfo(0)[0])).clip.length / ((AnimatorClipInfo)(ref val6.GetCurrentAnimatorClipInfo(0)[0])).clip.length);
				}
				mapper.props[prop1].transform.SetParent(((Component)mapper).transform);
				mapper.props[prop1].transform.localEulerAngles = Vector3.zero;
				mapper.props[prop1].transform.localPosition = Vector3.zero;
				mapper.ScaleProps();
			}
			if (newAnimation == "Float")
			{
				prop1 = mapper.props.Count;
				mapper.props.Add(Object.Instantiate<GameObject>(Assets.Load<GameObject>("@BadAssEmotes_badassemotes:assets/Prefabs/FloatLight.prefab")));
				mapper.props[prop1].transform.SetParent(((Component)mapper).transform);
				mapper.props[prop1].transform.localEulerAngles = Vector3.zero;
				mapper.props[prop1].transform.localPosition = Vector3.zero;
				mapper.ScaleProps();
			}
			if (newAnimation == "Markiplier")
			{
				prop1 = mapper.props.Count;
				mapper.props.Add(Object.Instantiate<GameObject>(Assets.Load<GameObject>("@BadAssEmotes_badassemotes:assets/Prefabs/Amogus.prefab")));
				Animator[] componentsInChildren4 = mapper.props[prop1].GetComponentsInChildren<Animator>();
				foreach (Animator val7 in componentsInChildren4)
				{
					val7.Play("Markimogus", 0, CustomAnimationClip.syncTimer[mapper.currentClip.syncPos] % ((AnimatorClipInfo)(ref val7.GetCurrentAnimatorClipInfo(0)[0])).clip.length / ((AnimatorClipInfo)(ref val7.GetCurrentAnimatorClipInfo(0)[0])).clip.length);
				}
				mapper.props[prop1].transform.SetParent(((Component)mapper).transform);
				mapper.props[prop1].transform.localEulerAngles = Vector3.zero;
				mapper.props[prop1].transform.localPosition = Vector3.zero;
				mapper.ScaleProps();
			}
			if (newAnimation == "OfficerEarl")
			{
				mapper.SetAutoWalk(1f, false);
			}
			if (newAnimation == "VirtualInsanityIntro")
			{
				mapper.SetAutoWalk(0.2f, false);
			}
			if (newAnimation == "MoveIt")
			{
				mapper.SetAutoWalk(0.2f, false);
			}
			if (newAnimation == "SpringLoaded")
			{
				mapper.SetAutoWalk(-1f, false);
			}
			if (newAnimation == "FloorSamus")
			{
				mapper.SetAutoWalk(0.5f, false);
			}
			if (newAnimation == "DuckThisOneIdle")
			{
				GameObject val8 = new GameObject();
				((Object)val8).name = "DuckThisOneIdleProp";
				mapper.props.Add(val8);
				val8.transform.localPosition = ((Component)mapper).transform.position;
				val8.transform.localEulerAngles = ((Component)mapper).transform.eulerAngles + new Vector3(0f, 0f, 0f);
				val8.transform.localScale = Vector3.one;
				val8.transform.SetParent(mapper.mapperBodyTransform.parent);
				mapper.AssignParentGameObject(val8, true, true, true, true, false);
			}
			if (newAnimation == "FullTilt")
			{
				mapper.SetAutoWalk(1f, false);
			}
			if (newAnimation == "Cartwheelin")
			{
				mapper.SetAutoWalk(0.75f, false);
			}
			if (newAnimation == "Smoke")
			{
				prop1 = mapper.props.Count;
				mapper.props.Add(Object.Instantiate<GameObject>(Assets.Load<GameObject>("@BadAssEmotes_badassemotes:assets/Prefabs/BluntAnimator.prefab")));
				Animator[] componentsInChildren5 = mapper.props[prop1].GetComponentsInChildren<Animator>();
				foreach (Animator val9 in componentsInChildren5)
				{
					val9.Play("Blunt", 0, CustomAnimationClip.syncTimer[mapper.currentClip.syncPos] % ((AnimatorClipInfo)(ref val9.GetCurrentAnimatorClipInfo(0)[0])).clip.length / ((AnimatorClipInfo)(ref val9.GetCurrentAnimatorClipInfo(0)[0])).clip.length);
				}
				mapper.props[prop1].transform.SetParent(((Component)mapper).transform);
				mapper.props[prop1].transform.localEulerAngles = Vector3.zero;
				mapper.props[prop1].transform.localPosition = Vector3.zero;
				ParticleSystem componentInChildren2 = mapper.props[prop1].GetComponentInChildren<ParticleSystem>();
				componentInChildren2.gravityModifier *= mapper.scale;
				LimitVelocityOverLifetimeModule limitVelocityOverLifetime = mapper.props[prop1].GetComponentInChildren<ParticleSystem>().limitVelocityOverLifetime;
				((LimitVelocityOverLifetimeModule)(ref limitVelocityOverLifetime)).dampen = ((LimitVelocityOverLifetimeModule)(ref limitVelocityOverLifetime)).dampen * mapper.scale;
				((LimitVelocityOverLifetimeModule)(ref limitVelocityOverLifetime)).limitMultiplier = mapper.scale;
				mapper.ScaleProps();
			}
			if (newAnimation == "Haruhi")
			{
				GameObject val10 = new GameObject();
				((Object)val10).name = "HaruhiProp";
				mapper.props.Add(val10);
				val10.transform.localPosition = ((Component)mapper).transform.position;
				val10.transform.localEulerAngles = ((Component)mapper).transform.eulerAngles;
				val10.transform.localScale = Vector3.one;
				mapper.AssignParentGameObject(val10, false, false, true, true, false);
			}
			if (newAnimation == "Security" && (Object)(object)mapper != (Object)(object)CustomEmotesAPI.localMapper)
			{
				prop1 = mapper.props.Count;
				mapper.props.Add(Object.Instantiate<GameObject>(Assets.Load<GameObject>("@BadAssEmotes_badassemotes:assets/prefabs/neversee.prefab")));
				mapper.props[prop1].transform.SetParent(((Component)mapper).gameObject.GetComponent<Animator>().GetBoneTransform((HumanBodyBones)7));
				mapper.props[prop1].transform.localEulerAngles = Vector3.zero;
				mapper.props[prop1].transform.localPosition = Vector3.zero;
				mapper.ScaleProps();
			}
			if (newAnimation == "IFU Stage")
			{
			}
			if (newAnimation == "Hydraulic Press")
			{
			}
			if (newAnimation == "Im a Mystery")
			{
				prop1 = mapper.props.Count;
				mapper.props.Add(Object.Instantiate<GameObject>(Assets.Load<GameObject>("@BadAssEmotes_badassemotes:assets/Prefabs/Im a Mystery.prefab")));
				Animator componentInChildren3 = mapper.props[prop1].GetComponentInChildren<Animator>();
				if (CustomAnimationClip.syncTimer[mapper.currentClip.syncPos] < 0.4f)
				{
					componentInChildren3.Play("Mystery Model Intro", 0, CustomAnimationClip.syncTimer[mapper.currentClip.syncPos] % 0.4f / 0.4f);
				}
				else
				{
					componentInChildren3.Play("Mstery Model", 0, (CustomAnimationClip.syncTimer[mapper.currentClip.syncPos] - 0.4f) % 7.333f / 7.333f);
				}
				mapper.props[prop1].transform.SetParent(((Component)mapper).transform);
				mapper.props[prop1].transform.localEulerAngles = Vector3.zero;
				mapper.props[prop1].transform.localPosition = Vector3.zero;
				mapper.ScaleProps();
			}
		}

		internal void AddAnimation(string AnimClip, AudioClip[] startClips, AudioClip[] loopClips, bool looping, bool dimAudio, bool sync, LockType lockType, string customName, AudioClip[] dmcaStartClips, AudioClip[] dmcaLoopClips, bool DMCA, float audio)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			AnimationClipParams val = new AnimationClipParams();
			val.animationClip = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/" + AnimClip + ".anim") };
			val.looping = looping;
			val._primaryAudioClips = startClips;
			val._secondaryAudioClips = loopClips;
			val.dimWhenClose = dimAudio;
			val.syncAnim = sync;
			val.syncAudio = sync;
			val.lockType = lockType;
			val.customName = customName;
			val._primaryDMCAFreeAudioClips = dmcaStartClips;
			val._secondaryDMCAFreeAudioClips = dmcaLoopClips;
			val.willGetClaimedByDMCA = DMCA;
			val.audioLevel = audio;
			CustomEmotesAPI.AddCustomAnimation(val);
		}

		internal void AddAnimation(string AnimClip, string startClip, string loopClip, bool looping, bool dimAudio, bool sync, LockType lockType, string customName, string dmcaStartClip, string dmcaLoopClip, bool DMCA, float audio)
		{
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Expected O, but got Unknown
			//IL_0147: 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)
			AudioClip[] primaryAudioClips = (AudioClip[])(object)((!(startClip == "")) ? new AudioClip[1] { Assets.Load<AudioClip>("assets/compressedaudio/" + startClip + ".ogg") } : null);
			AudioClip[] secondaryAudioClips = (AudioClip[])(object)((!(loopClip == "")) ? new AudioClip[1] { Assets.Load<AudioClip>("assets/compressedaudio/" + loopClip + ".ogg") } : null);
			AudioClip[] primaryDMCAFreeAudioClips = (AudioClip[])(object)((!(dmcaStartClip == "")) ? new AudioClip[1] { Assets.Load<AudioClip>("assets/DMCAMusic/" + dmcaStartClip + "_NNTranscription.ogg") } : null);
			AudioClip[] secondaryDMCAFreeAudioClips = (AudioClip[])(object)((!(dmcaLoopClip == "")) ? new AudioClip[1] { Assets.Load<AudioClip>("assets/DMCAMusic/" + dmcaLoopClip + "_NNTranscription.ogg") } : null);
			AnimationClipParams val = new AnimationClipParams();
			val.animationClip = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/" + AnimClip + ".anim") };
			val.looping = looping;
			val._primaryAudioClips = primaryAudioClips;
			val._secondaryAudioClips = secondaryAudioClips;
			val.dimWhenClose = dimAudio;
			val.syncAnim = sync;
			val.syncAudio = sync;
			val.lockType = lockType;
			val.customName = customName;
			val._primaryDMCAFreeAudioClips = primaryDMCAFreeAudioClips;
			val._secondaryDMCAFreeAudioClips = secondaryDMCAFreeAudioClips;
			val.willGetClaimedByDMCA = DMCA;
			val.audioLevel = audio;
			CustomEmotesAPI.AddCustomAnimation(val);
		}

		internal void AddAnimation(string AnimClip, string AnimClip2, string startClip, string loopClip, bool looping, bool dimAudio, bool sync, LockType lockType, string customName, string dmcaStartClip, string dmcaLoopClip, bool DMCA, float audio)
		{
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Expected O, but got Unknown
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: Unknown result type (might be due to invalid IL or missing references)
			AudioClip[] primaryAudioClips = (AudioClip[])(object)((!(startClip == "")) ? new AudioClip[1] { Assets.Load<AudioClip>("assets/compressedaudio/" + startClip + ".ogg") } : null);
			AudioClip[] secondaryAudioClips = (AudioClip[])(object)((!(loopClip == "")) ? new AudioClip[1] { Assets.Load<AudioClip>("assets/compressedaudio/" + loopClip + ".ogg") } : null);
			AudioClip[] primaryDMCAFreeAudioClips = (AudioClip[])(object)((!(dmcaStartClip == "")) ? new AudioClip[1] { Assets.Load<AudioClip>("assets/DMCAMusic/" + dmcaStartClip + "_NNTranscription.ogg") } : null);
			AudioClip[] secondaryDMCAFreeAudioClips = (AudioClip[])(object)((!(dmcaLoopClip == "")) ? new AudioClip[1] { Assets.Load<AudioClip>("assets/DMCAMusic/" + dmcaLoopClip + "_NNTranscription.ogg") } : null);
			AnimationClipParams val = new AnimationClipParams();
			val.animationClip = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/" + AnimClip + ".anim") };
			val.secondaryAnimation = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/" + AnimClip2 + ".anim") };
			val.looping = looping;
			val._primaryAudioClips = primaryAudioClips;
			val._secondaryAudioClips = secondaryAudioClips;
			val.dimWhenClose = dimAudio;
			val.syncAnim = sync;
			val.syncAudio = sync;
			val.lockType = lockType;
			val.customName = customName;
			val._primaryDMCAFreeAudioClips = primaryDMCAFreeAudioClips;
			val._secondaryDMCAFreeAudioClips = secondaryDMCAFreeAudioClips;
			val.willGetClaimedByDMCA = DMCA;
			val.audioLevel = audio;
			CustomEmotesAPI.AddCustomAnimation(val);
		}

		internal void AddAnimation(string AnimClip, string[] startClip, bool looping, bool dimaudio, bool sync, LockType lockType, string customName, string[] dmcaStartClips, bool DMCA, float audio)
		{
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Expected O, but got Unknown
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			List<AudioClip> list = new List<AudioClip>();
			foreach (string text in startClip)
			{
				list.Add(Assets.Load<AudioClip>("assets/compressedaudio/" + text + ".ogg"));
			}
			List<AudioClip> list2 = new List<AudioClip>();
			foreach (string text2 in dmcaStartClips)
			{
				if (text2 == "")
				{
					list2.Add(null);
				}
				else
				{
					list2.Add(Assets.Load<AudioClip>("assets/DMCAMusic/" + text2 + "_NNTranscription.ogg"));
				}
			}
			AnimationClipParams val = new AnimationClipParams();
			val.animationClip = (AnimationClip[])(object)new AnimationClip[1] { Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/" + AnimClip + ".anim") };
			val.looping = looping;
			val._primaryAudioClips = list.ToArray();
			val._secondaryAudioClips = null;
			val.dimWhenClose = dimaudio;
			val.syncAnim = sync;
			val.syncAudio = sync;
			val.lockType = lockType;
			val.customName = customName;
			val._primaryDMCAFreeAudioClips = list2.ToArray();
			val.willGetClaimedByDMCA = DMCA;
			val.audioLevel = audio;
			CustomEmotesAPI.AddCustomAnimation(val);
		}

		internal void AddStartAndJoinAnim(string[] AnimClip, string startClip, bool looping, bool dimaudio, bool sync, LockType lockType, string customName, string dmcaStartClip, bool DMCA, float audio)
		{
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_011f: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Expected O, but got Unknown
			AudioClip[] primaryAudioClips = (AudioClip[])(object)((!(startClip == "")) ? new AudioClip[1] { Assets.Load<AudioClip>("assets/compressedaudio/" + startClip + ".ogg") } : null);
			AudioClip[] primaryDMCAFreeAudioClips = (AudioClip[])(object)((!(dmcaStartClip == "")) ? new AudioClip[1] { Assets.Load<AudioClip>("assets/DMCAMusic/" + dmcaStartClip + "_NNTranscription.ogg") } : null);
			List<AnimationClip> list = new List<AnimationClip>();
			foreach (string text in AnimClip)
			{
				list.Add(Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/badassemotes/" + text + ".anim"));
			}
			CustomEmotesAPI.AddCustomAnimation(new AnimationClipParams
			{
				animationClip = list.ToArray(),
				looping = looping,
				_primaryAudioClips = primaryAudioClips,
				_secondaryAudioClips = null,
				dimWhenClose = dimaudio,
				syncAnim = sync,
				syncAudio = sync,
				startPref = 0,
				joinPref = 1,
				lockType = lockType,
				customName = customName,
				_primaryDMCAFreeAudioClips = primaryDMCAFreeAudioClips,
				willGetClaimedByDMCA = DMCA,
				audioLevel = audio
			});
		}

		internal void AddStartAndJoinAnim(string[] AnimClip, string startClip, string[] AnimClip2, bool looping, bool dimaudio, bool sync, LockType lockType, string customName, string dmcaStartClip, bool DMCA, float audio)
		{
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_011e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: 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_013d: 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_014b: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0153: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0162: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Expected O, but got Unknown
			AudioClip[] primaryAudioClips = (AudioClip[])(object)((!(startClip == "")) ? new AudioClip[1] { Assets.Load<AudioClip>("assets/compressedaudio/" + startClip + ".ogg") } : null);
			AudioClip[] primaryDMCAFreeAudioClips = (AudioClip[])(object)((!(dmcaStartClip == "")) ? new AudioClip[1] { Assets.Load<AudioClip>("assets/compressedaudio/" + dmcaStartClip + ".ogg") } : null);
			List<AnimationClip> list = new List<AnimationClip>();
			foreach (string text in AnimClip)
			{
				list.Add(Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/DMCAMusic/" + text + "_NNTranscription.anim"));
			}
			List<AnimationClip> list2 = new List<AnimationClip>();
			foreach (string text2 in AnimClip2)
			{
				list2.Add(Assets.Load<AnimationClip>("@ExampleEmotePlugin_badassemotes:assets/DMCAMusic/" + text2 + "_NNTranscription.anim"));
			}
			CustomEmotesAPI.AddCustomAnimation(new AnimationClipParams
			{
				animationClip = list.ToArray(),
				secondaryAnimation = list2.ToArray(),
				looping = looping,
				_primaryAudioClips = primaryAudioClips,
				dimWhenClose = dimaudio,
				syncAnim = sync,
				syncAudio = sync,
				startPref = 0,
				joinPref = 1,
				lockType = lockType,
				customName = customName,
				_primaryDMCAFreeAudioClips = primaryDMCAFreeAudioClips,
				willGetClaimedByDMCA = DMCA,
				audioLevel = audio
			});
		}
	}
	internal class HydrolicPressComponent : MonoBehaviour
	{
		private bool crushPlayer = false;

		private Transform pressTransform;

		internal BoneMapper boneMapper;

		private bool compressing = true;

		private Vector3 currentScale;

		private float doNotRevert;

		private bool spawnedFeathers = false;

		private void Start()
		{
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			((MonoBehaviour)this).StartCoroutine(CrushAfterSeconds(3.5f));
			pressTransform = BadAssEmotesPlugin.pressMechanism.transform.Find("press");
			BadAssEmotesPlugin.pressMechanism.transform.localScale = new Vector3(boneMapper.scale, boneMapper.scale, boneMapper.scale);
		}

		private void Update()
		{
			//IL_0007: 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_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: 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_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: 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_0266: Unknown result type (might be due to invalid IL or missing references)
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0210: Unknown result type (might be due to invalid IL or missing references)
			//IL_0294: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_030e: Unknown result type (might be due to invalid IL or missing references)
			if (((Component)this).transform.localScale.y > 0.01f && compressing)
			{
				if (crushPlayer)
				{
					((Component)this).transform.localScale = new Vector3(((Component)this).transform.localScale.x + 0.16f * Time.deltaTime, ((Component)this).transform.localScale.y - 0.16f * Time.deltaTime, ((Component)this).transform.localScale.z + 0.16f * Time.deltaTime);
				}
				pressTransform.localScale = new Vector3(pressTransform.localScale.x, pressTransform.localScale.y, pressTransform.localScale.z + 0.154f * Time.deltaTime);
				if (!spawnedFeathers && ((Component)this).transform.localScale.y < 0.107f)
				{
					int count = boneMapper.props.Count;
					GameObject val = Assets.Load<GameObject>("@BadAssEmotes_badassemotes:assets/Prefabs/explosion press.prefab");
					boneMapper.props.Add(Object.Instantiate<GameObject>(val));
					boneMapper.props[count].transform.SetParent(((Component)boneMapper).transform);
					boneMapper.props[count].transform.localEulerAngles = new Vector3(270f, 0f, 0f);
					boneMapper.props[count].transform.localPosition = Vector3.zero;
					boneMapper.props[count].transform.SetParent((Transform)null);
					boneMapper.props[count].transform.localScale = new Vector3(boneMapper.scale, boneMapper.scale, boneMapper.scale);
					((MonoBehaviour)BadAssEmotesPlugin.instance).StartCoroutine(BadAssEmotesPlugin.instance.WaitForSecondsThenDeleteGameObject(boneMapper.props[count], 10f));
					boneMapper.props.RemoveAt(count);
					spawnedFeathers = true;
				}
				if (((Component)this).transform.localScale.y < 0.01f)
				{
					compressing = false;
					((Component)this).transform.localScale = new Vector3(((Component)this).transform.localScale.x, 0.01f, ((Component)this).transform.localScale.z);
					currentScale = ((Component)this).transform.localScale;
					doNotRevert = 0f;
					((Component)this).transform.parent = null;
					((Component)this).transform.localScale = currentScale;
					pressTransform.localScale = new Vector3(0.8631962f, 0.8631962f, 0.8631962f);
				}
			}
		}

		private void OnDestroy()
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)((Component)this).transform.parent == (Object)(object)pressTransform.parent)
			{
				pressTransform.localScale = new Vector3(0.8631962f, 0.8631962f, 0.8631962f);
			}
		}

		private IEnumerator CrushAfterSeconds(float time)
		{
			yield return (object)new WaitForSeconds(time);
			crushPlayer = true;
		}
	}
	internal class HydrolicPressMechanism : MonoBehaviour
	{
		public bool lowes = false;

		private static Texture lowesTex = Assets.Load<Texture>("assets/hydrolic/textures/lowes.jpg");

		private static Texture homedepotTex = Assets.Load<Texture>("assets/hydrolic/textures/Home-Depot-Logo.jpg");

		private void Start()
		{
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			BadAssEmotesPlugin.pressMechanism = ((Component)this).gameObject;
			((Renderer)((Component)this).GetComponentInChildren<MeshRenderer>()).sharedMaterials[0].mainTexture = (lowes ? lowesTex : homedepotTex);
			((Renderer)((Component)this).GetComponentInChildren<MeshRenderer>()).sharedMaterials[4].color = (lowes ? new Color(3f / 85f, 0.20392157f, 31f / 85f) : new Color(0.75686276f, 0.30980393f, 0f));
		}

		private void OnDestroy()
		{
			if ((Object)(object)BadAssEmotesPlugin.pressMechanism == (Object)(object)((Component)this).gameObject)
			{
				BadAssEmotesPlugin.pressMechanism = null;
			}
		}
	}
	public class LivingParticleArrayController : MonoBehaviour
	{
		public Transform[] affectors;

		private Vector4[] positions;

		private ParticleSystemRenderer psr;

		private void Start()
		{
			psr = ((Component)this).GetComponent<ParticleSystemRenderer>();
			Vector4[] array = (Vector4[])(object)new Vector4[120];
			((Renderer)psr).material.SetVectorArray("_Affectors", array);
		}

		private void Update()
		{
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: 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)
			positions = (Vector4[])(object)new Vector4[affectors.Length];
			for (int i = 0; i < positions.Length; i++)
			{
				if (Object.op_Implicit((Object)(object)affectors[i]))
				{
					positions[i] = Vector4.op_Implicit(affectors[i].position);
				}
				else
				{
					positions[i] = Vector4.op_Implicit(new Vector3(555f, 555f, 555f));
				}
			}
			((Renderer)psr).material.SetVectorArray("_Affectors", positions);
			((Renderer)psr).material.SetInt("_AffectorCount", affectors.Length);
		}
	}
	public class LivingParticleController : MonoBehaviour
	{
		public Transform affector;

		private ParticleSystemRenderer psr;

		private void Start()
		{
			psr = ((Component)this).GetComponent<ParticleSystemRenderer>();
		}

		private void Update()
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			((Renderer)psr).material.SetVector("_Affector", Vector4.op_Implicit(affector.position));
		}
	}
	public class ParticleGridGenerator : MonoBehaviour
	{
		public bool rewriteVertexStreams = true;

		public bool GPU = false;

		public float particleSize = 1f;

		public Color particleColor = Color.white;

		public Vector3 particleRotation3D;

		public bool randomColorAlpha = true;

		public float xDistance = 0.25f;

		public float yDistance = 0.25f;

		public float zDistance = 0.25f;

		public int xSize = 10;

		public int ySize = 10;

		public int zSize = 10;

		public float OffsetEven = 0.125f;

		public bool updateEveryFrame = false;

		private float even;

		private Vector3[] positions;

		private ParticleSystem ps;

		private Particle[] particles;

		private List<Vector4> customData = new List<Vector4>();

		private List<Vector4> customData2 = new List<Vector4>();

		private void Start()
		{
			ps = ((Component)this).GetComponent<ParticleSystem>();
			UpdateGrid();
		}

		private void OnEnable()
		{
			ps = ((Component)this).GetComponent<ParticleSystem>();
			UpdateGrid();
		}

		public void UpdateGrid()
		{
			GenerateGrid();
			GenerateParticles();
			CreateOffsetVector();
			ParticleSystemRenderer component = ((Component)this).GetComponent<ParticleSystemRenderer>();
			if (rewriteVertexStreams)
			{
				ParticleSystemVertexStream[] array = new ParticleSystemVertexStream[7];
				RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
				component.SetActiveVertexStreams(new List<ParticleSystemVertexStream>((IEn

plugins/Gemumoddo-LethalEmotesAPI/LethalEmotesAPI.dll

Decompiled 6 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using AdvancedCompany.Game;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using EmotesAPI;
using GameNetcodeStuff;
using HarmonyLib;
using LethalCompanyInputUtils.Api;
using LethalConfig;
using LethalConfig.ConfigItems;
using LethalConfig.ConfigItems.Options;
using LethalEmotesAPI;
using LethalEmotesAPI.Core;
using LethalEmotesAPI.Data;
using LethalEmotesAPI.Patches;
using LethalEmotesAPI.Patches.ModCompat;
using LethalEmotesAPI.Utils;
using LethalEmotesApi.Ui;
using LethalEmotesApi.Ui.Data;
using LethalEmotesApi.Ui.Db;
using LethalVRM;
using Microsoft.CodeAnalysis;
using ModelReplacement;
using MonoMod.RuntimeDetour;
using MoreCompany.Cosmetics;
using Newtonsoft.Json;
using TMPro;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
using UnityEngine.Rendering;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("AdvancedCompany")]
[assembly: IgnoresAccessChecksTo("AdvancedCompany.Preloader")]
[assembly: IgnoresAccessChecksTo("AdvancedCompany.Unity")]
[assembly: IgnoresAccessChecksTo("LethalVRM")]
[assembly: IgnoresAccessChecksTo("MToon")]
[assembly: IgnoresAccessChecksTo("UniGLTF")]
[assembly: IgnoresAccessChecksTo("UniGLTF.Utils")]
[assembly: IgnoresAccessChecksTo("UniHumanoid")]
[assembly: IgnoresAccessChecksTo("VRM10")]
[assembly: IgnoresAccessChecksTo("VrmLib")]
[assembly: IgnoresAccessChecksTo("VRMShaders.GLTF.IO.Runtime")]
[assembly: IgnoresAccessChecksTo("VRMShaders.VRM.IO.Runtime")]
[assembly: IgnoresAccessChecksTo("VRMShaders.VRM10.Format.Runtime")]
[assembly: IgnoresAccessChecksTo("VRMShaders.VRM10.MToon10.Runtime")]
[assembly: AssemblyCompany("LethalEmotesAPI")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+6824dbf199dd246b0a2833650efb755f5c661453")]
[assembly: AssemblyProduct("LethalEmotesAPI")]
[assembly: AssemblyTitle("LethalEmotesAPI")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
internal class <Module>
{
	static <Module>()
	{
	}
}
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
internal static class AnimationReplacements
{
	internal static GameObject g;

	internal static bool setup;

	internal static void RunAll()
	{
		ChangeAnims();
	}

	internal static BoneMapper Import(GameObject prefab, string skeleton, int[] pos, bool hidemesh = true)
	{
		GameObject val = Object.Instantiate<GameObject>(Assets.Load<GameObject>("@CustomEmotesAPI_customemotespackage:assets/animationreplacements/commando.prefab"));
		Assets.Load<GameObject>(skeleton).GetComponent<Animator>().runtimeAnimatorController = val.GetComponent<Animator>().runtimeAnimatorController;
		BoneMapper boneMapper = ApplyAnimationStuff(prefab, Object.Instantiate<GameObject>(Assets.Load<GameObject>(skeleton)), pos, hidemesh, jank: false, revertBonePositions: true);
		val.transform.SetParent(((Component)boneMapper).transform);
		return boneMapper;
	}

	public static void DebugBones(GameObject fab)
	{
		SkinnedMeshRenderer[] componentsInChildren = fab.GetComponentsInChildren<SkinnedMeshRenderer>();
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.Append($"rendererererer: {componentsInChildren[0]}\n");
		stringBuilder.Append($"bone count: {componentsInChildren[0].bones.Length}\n");
		stringBuilder.Append($"mesh count: {componentsInChildren.Length}\n");
		stringBuilder.Append("root bone: " + ((Object)componentsInChildren[0].rootBone).name + "\n");
		stringBuilder.Append(((object)fab).ToString() + ":\n");
		SkinnedMeshRenderer[] array = componentsInChildren;
		foreach (SkinnedMeshRenderer val in array)
		{
			if (val.bones.Length == 0)
			{
				stringBuilder.Append("No bones");
			}
			else
			{
				stringBuilder.Append("[");
				Transform[] bones = val.bones;
				foreach (Transform val2 in bones)
				{
					stringBuilder.Append("'" + ((Object)val2).name + "', ");
				}
				stringBuilder.Remove(stringBuilder.Length - 2, 2);
				stringBuilder.Append("]");
			}
			stringBuilder.Append("\n\n");
			DebugClass.Log(stringBuilder.ToString());
		}
	}

	internal static void ChangeAnims()
	{
	}

	internal static void ApplyAnimationStuff(GameObject bodyPrefab, string resource, int[] pos)
	{
		GameObject animcontroller = Assets.Load<GameObject>(resource);
		ApplyAnimationStuff(bodyPrefab, animcontroller, pos);
	}

	internal static BoneMapper ApplyAnimationStuff(GameObject bodyPrefab, GameObject animcontroller, int[] pos, bool hidemeshes = true, bool jank = false, bool revertBonePositions = false)
	{
		//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0107: Unknown result type (might be due to invalid IL or missing references)
		//IL_0118: Unknown result type (might be due to invalid IL or missing references)
		//IL_0222: Unknown result type (might be due to invalid IL or missing references)
		//IL_0234: Unknown result type (might be due to invalid IL or missing references)
		//IL_024d: Unknown result type (might be due to invalid IL or missing references)
		//IL_025e: Unknown result type (might be due to invalid IL or missing references)
		try
		{
			if (!animcontroller.GetComponentInChildren<Animator>().avatar.isHuman)
			{
				DebugClass.Log($"{animcontroller}'s avatar isn't humanoid, please fix it in unity!");
				return null;
			}
		}
		catch (Exception arg)
		{
			DebugClass.Log($"Had issue checking if avatar was humanoid: {arg}");
			throw;
		}
		try
		{
			if (hidemeshes)
			{
				SkinnedMeshRenderer[] componentsInChildren = animcontroller.GetComponentsInChildren<SkinnedMeshRenderer>();
				foreach (SkinnedMeshRenderer val in componentsInChildren)
				{
					val.sharedMesh = null;
				}
				MeshFilter[] componentsInChildren2 = animcontroller.GetComponentsInChildren<MeshFilter>();
				foreach (MeshFilter val2 in componentsInChildren2)
				{
					val2.sharedMesh = null;
				}
			}
		}
		catch (Exception arg2)
		{
			DebugClass.Log($"Had trouble while hiding meshes: {arg2}");
			throw;
		}
		Transform transform = ((Component)bodyPrefab.GetComponentInChildren<Animator>()).transform;
		try
		{
			animcontroller.transform.parent = transform;
			animcontroller.transform.localPosition = Vector3.zero;
			animcontroller.transform.eulerAngles = bodyPrefab.transform.eulerAngles;
			animcontroller.transform.localScale = Vector3.one;
		}
		catch (Exception arg3)
		{
			DebugClass.Log($"Had trouble setting emote skeletons parent: {arg3}");
			throw;
		}
		SkinnedMeshRenderer[] array = (SkinnedMeshRenderer[])(object)new SkinnedMeshRenderer[pos.Length];
		SkinnedMeshRenderer emoteSkeletonSMR;
		try
		{
			emoteSkeletonSMR = animcontroller.GetComponentsInChildren<SkinnedMeshRenderer>()[0];
		}
		catch (Exception arg4)
		{
			DebugClass.Log($"Had trouble setting emote skeletons SkinnedMeshRenderer: {arg4}");
			throw;
		}
		try
		{
			for (int k = 0; k < pos.Length; k++)
			{
				array[k] = bodyPrefab.GetComponentsInChildren<SkinnedMeshRenderer>()[pos[k]];
			}
		}
		catch (Exception arg5)
		{
			DebugClass.Log($"Had trouble setting the original skeleton's skinned mesh renderer: {arg5}");
			throw;
		}
		BoneMapper boneMapper = animcontroller.AddComponent<BoneMapper>();
		try
		{
			boneMapper.jank = jank;
			boneMapper.emoteSkeletonSMR = emoteSkeletonSMR;
			boneMapper.basePlayerModelSMR = array;
			boneMapper.bodyPrefab = bodyPrefab;
			boneMapper.basePlayerModelAnimator = ((Component)transform).GetComponentInChildren<Animator>();
			boneMapper.emoteSkeletonAnimator = animcontroller.GetComponentInChildren<Animator>();
		}
		catch (Exception arg6)
		{
			DebugClass.Log($"Had issue when setting up BoneMapper settings 1: {arg6}");
			throw;
		}
		try
		{
			GameObject val3 = Assets.Load<GameObject>("assets/customstuff/scavEmoteSkeleton.prefab");
			float num = Vector3.Distance(val3.GetComponentInChildren<Animator>().GetBoneTransform((HumanBodyBones)10).position, val3.GetComponentInChildren<Animator>().GetBoneTransform((HumanBodyBones)5).position);
			float num2 = Vector3.Distance(animcontroller.GetComponentInChildren<Animator>().GetBoneTransform((HumanBodyBones)10).position, animcontroller.GetComponentInChildren<Animator>().GetBoneTransform((HumanBodyBones)5).position);
			boneMapper.scale = num2 / num;
			boneMapper.model = ((Component)transform).gameObject;
		}
		catch (Exception arg7)
		{
			DebugClass.Log($"Had issue when setting up BoneMapper settings 2: {arg7}");
			throw;
		}
		boneMapper.revertTransform = revertBonePositions;
		return boneMapper;
	}
}
public struct WorldProp
{
	internal GameObject prop;

	internal JoinSpot[] joinSpots;

	public WorldProp(GameObject _prop, JoinSpot[] _joinSpots)
	{
		prop = _prop;
		joinSpots = _joinSpots;
	}
}
public enum TempThirdPerson
{
	none,
	on,
	off
}
public class BoneMapper : MonoBehaviour
{
	public static List<AudioClip[]> primaryAudioClips = new List<AudioClip[]>();

	public static List<AudioClip[]> secondaryAudioClips = new List<AudioClip[]>();

	public static List<AudioClip[]> primaryDMCAFreeAudioClips = new List<AudioClip[]>();

	public static List<AudioClip[]> secondaryDMCAFreeAudioClips = new List<AudioClip[]>();

	public GameObject audioObject;

	public SkinnedMeshRenderer emoteSkeletonSMR;

	public SkinnedMeshRenderer[] basePlayerModelSMR;

	public Animator basePlayerModelAnimator;

	public Animator emoteSkeletonAnimator;

	public int h;

	public List<BonePair> pairs = new List<BonePair>();

	public float timer = 0f;

	public GameObject model;

	private bool twopart = false;

	public static Dictionary<string, CustomAnimationClip> animClips = new Dictionary<string, CustomAnimationClip>();

	public CustomAnimationClip currentClip = null;

	public string currentClipName = "none";

	public string prevClipName = "none";

	public CustomAnimationClip prevClip = null;

	internal static float Current_MSX = 69f;

	internal static List<BoneMapper> allMappers = new List<BoneMapper>();

	internal static List<WorldProp> allWorldProps = new List<WorldProp>();

	public bool local = false;

	internal static bool moving = false;

	internal static bool attacking = false;

	public bool jank = false;

	public List<GameObject> props = new List<GameObject>();

	public float scale = 1f;

	internal int desiredEvent = 0;

	public int currEvent = 0;

	public float autoWalkSpeed = 0f;

	public bool overrideMoveSpeed = false;

	public bool autoWalk = false;

	public GameObject currentEmoteSpot = null;

	public GameObject reservedEmoteSpot = null;

	public bool worldProp = false;

	public bool ragdolling = false;

	public GameObject bodyPrefab;

	public int uniqueSpot = -1;

	public bool preserveProps = false;

	public bool preserveParent = false;

	internal bool useSafePositionReset = false;

	public List<EmoteLocation> emoteLocations = new List<EmoteLocation>();

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

	public bool enableAnimatorOnDeath = true;

	public bool revertTransform = false;

	public bool oneFrameAnimatorLeeWay = false;

	public GameObject mapperBody;

	public PlayerControllerB playerController;

	public EnemyAI enemyController;

	public Transform mapperBodyTransform;

	public static bool firstMapperSpawn = true;

	public static List<List<AudioSource>> listOfCurrentEmoteAudio = new List<List<AudioSource>>();

	public List<EmoteConstraint> cameraConstraints = new List<EmoteConstraint>();

	public List<EmoteConstraint> itemHolderConstraints = new List<EmoteConstraint>();

	public Transform itemHolderPosition;

	public List<EmoteConstraint> additionalConstraints = new List<EmoteConstraint>();

	public EmoteConstraint thirdPersonConstraint;

	public static Dictionary<string, string> customNamePairs = new Dictionary<string, string>();

	public Vector3 positionBeforeRootMotion = new Vector3(69f, 69f, 69f);

	public Quaternion rotationBeforeRootMotion = Quaternion.identity;

	public float currentAudioLevel = 0f;

	public TempThirdPerson temporarilyThirdPerson = TempThirdPerson.none;

	internal int originalCullingMask;

	internal bool needToTurnOffRenderingThing = false;

	public BoneMapper currentlyLockedBoneMapper;

	public static Dictionary<GameObject, BoneMapper> playersToMappers = new Dictionary<GameObject, BoneMapper>();

	public AudioSource personalAudioSource;

	public bool isServer = false;

	public int networkId;

	public bool canThirdPerson = true;

	internal bool canEmote = false;

	public GameObject parentGameObject;

	public bool positionLock;

	public bool rotationLock;

	public bool scaleLock;

	private Vector3 ogScale = new Vector3(-69f, -69f, -69f);

	private Vector3 scaleDiff = Vector3.one;

	public GameObject rotationPoint;

	public GameObject desiredCameraPos;

	public GameObject realCameraPos;

	private bool ranSinceLastAnim = false;

	public Vector3 deltaPos = new Vector3(0f, 0f, 0f);

	public Quaternion deltaRot = Quaternion.identity;

	public Vector3 prevPosition = Vector3.zero;

	public Quaternion prevRotation = Quaternion.identity;

	public Vector3 prevMapperPos = new Vector3(69f, 69f, 69f);

	public Vector3 prevMapperRot = default(Vector3);

	public bool justSwitched = false;

	public bool isEnemy = false;

	public bool isInThirdPerson = false;

	public int originalLayer = -1;

	internal bool needToTurnOffShadows = true;

	internal bool needToTurnOffCosmetics = true;

	public static string GetRealAnimationName(string animationName)
	{
		if (customNamePairs.ContainsKey(animationName))
		{
			return customNamePairs[animationName];
		}
		return animationName;
	}

	public void PlayAnim(string s, int pos, int eventNum)
	{
		desiredEvent = eventNum;
		s = GetRealAnimationName(s);
		PlayAnim(s, pos);
	}

	public void PlayAnim(string s, int pos)
	{
		//IL_0561: Unknown result type (might be due to invalid IL or missing references)
		//IL_0567: Expected O, but got Unknown
		ranSinceLastAnim = false;
		s = GetRealAnimationName(s);
		prevClipName = currentClipName;
		if (s != "none")
		{
			if (!animClips.ContainsKey(s))
			{
				DebugClass.Log("No emote bound to the name [" + s + "]");
				return;
			}
			if (animClips[s] == null)
			{
				CustomEmotesAPI.Changed(s, this);
				return;
			}
		}
		((Behaviour)emoteSkeletonAnimator).enabled = true;
		dontAnimateUs.Clear();
		try
		{
			((object)currentClip.clip[0]).ToString();
			try
			{
				if (currentClip.syncronizeAnimation || currentClip.syncronizeAudio)
				{
					CustomAnimationClip.syncPlayerCount[currentClip.syncPos]--;
				}
				audioObject.GetComponent<AudioManager>().Stop();
			}
			catch (Exception arg)
			{
				DebugClass.Log($"had issue turning off audio before new audio played step 1: {arg}");
			}
			try
			{
				if ((Object)(object)primaryAudioClips[currentClip.syncPos][currEvent] != (Object)null && currentClip.syncronizeAudio)
				{
					try
					{
						listOfCurrentEmoteAudio[currentClip.syncPos].Remove(audioObject.GetComponent<AudioSource>());
					}
					catch (Exception arg2)
					{
						DebugClass.Log($"had issue turning off audio before new audio played step 2: {arg2}");
						try
						{
							DebugClass.Log($"{prevClip.syncPos}");
							DebugClass.Log($"{currentClip.syncPos}");
							DebugClass.Log(listOfCurrentEmoteAudio[currentClip.syncPos]);
						}
						catch (Exception)
						{
						}
						try
						{
							DebugClass.Log("going to try a brute force method to avoid audio desync issues");
							foreach (List<AudioSource> item in listOfCurrentEmoteAudio)
							{
								if (item.Contains(audioObject.GetComponent<AudioSource>()))
								{
									item.Remove(audioObject.GetComponent<AudioSource>());
								}
							}
						}
						catch (Exception arg3)
						{
							DebugClass.Log($"wow {arg3}");
						}
					}
				}
			}
			catch (Exception ex2)
			{
				DebugClass.Log($"had issue turning off audio before new audio played step 3: {primaryAudioClips[currentClip.syncPos]} {currentClip.syncPos} {currEvent} {ex2}");
			}
			try
			{
				if (uniqueSpot != -1 && CustomAnimationClip.uniqueAnimations[currentClip.syncPos][uniqueSpot])
				{
					CustomAnimationClip.uniqueAnimations[currentClip.syncPos][uniqueSpot] = false;
					uniqueSpot = -1;
				}
			}
			catch (Exception arg4)
			{
				DebugClass.Log($"had issue turning off audio before new audio played step 4: {arg4}");
			}
		}
		catch (Exception)
		{
		}
		currEvent = 0;
		currentClipName = s;
		if (s != "none")
		{
			prevClip = currentClip;
			currentClip = animClips[s];
			try
			{
				((object)currentClip.clip[0]).ToString();
			}
			catch (Exception)
			{
				return;
			}
			if (pos == -2)
			{
				pos = ((CustomAnimationClip.syncPlayerCount[animClips[s].syncPos] != 0) ? animClips[s].joinPref : animClips[s].startPref);
			}
			if (pos == -2)
			{
				for (int i = 0; i < CustomAnimationClip.uniqueAnimations[currentClip.syncPos].Count; i++)
				{
					if (!CustomAnimationClip.uniqueAnimations[currentClip.syncPos][i])
					{
						pos = i;
						uniqueSpot = pos;
						CustomAnimationClip.uniqueAnimations[currentClip.syncPos][uniqueSpot] = true;
						break;
					}
				}
				if (uniqueSpot == -1)
				{
					pos = -1;
				}
			}
			if (pos == -1)
			{
				pos = Random.Range(0, currentClip.clip.Length);
			}
			LockBones();
		}
		if (s == "none")
		{
			emoteSkeletonAnimator.Play("none", -1, 0f);
			twopart = false;
			prevClip = currentClip;
			currentClip = null;
			NewAnimation(null);
			CustomEmotesAPI.Changed(s, this);
			return;
		}
		AnimatorOverrideController animController = new AnimatorOverrideController(emoteSkeletonAnimator.runtimeAnimatorController);
		if (currentClip.syncronizeAnimation || currentClip.syncronizeAudio)
		{
			CustomAnimationClip.syncPlayerCount[currentClip.syncPos]++;
		}
		if (currentClip.syncronizeAnimation && CustomAnimationClip.syncPlayerCount[currentClip.syncPos] == 1)
		{
			CustomAnimationClip.syncTimer[currentClip.syncPos] = 0f;
		}
		if ((Object)(object)primaryAudioClips[currentClip.syncPos][currEvent] != (Object)null)
		{
			if (CustomAnimationClip.syncPlayerCount[currentClip.syncPos] == 1 && currentClip.syncronizeAudio)
			{
				if (desiredEvent != -1)
				{
					currEvent = desiredEvent;
				}
				else
				{
					currEvent = Random.Range(0, primaryAudioClips[currentClip.syncPos].Length);
				}
				foreach (BoneMapper allMapper in allMappers)
				{
					allMapper.currEvent = currEvent;
				}
				if (currentClip.customPostEventCodeSync != null)
				{
					currentClip.customPostEventCodeSync(this);
				}
			}
			else if (!currentClip.syncronizeAudio)
			{
				currEvent = Random.Range(0, primaryAudioClips[currentClip.syncPos].Length);
				if (currentClip.customPostEventCodeNoSync != null)
				{
					currentClip.customPostEventCodeNoSync(this);
				}
			}
			currentAudioLevel = currentClip.audioLevel;
			audioObject.GetComponent<AudioManager>().Play(currentClip.syncPos, currEvent, currentClip.looping, currentClip.syncronizeAudio, currentClip.willGetClaimed);
			if (currentClip.syncronizeAudio && (Object)(object)primaryAudioClips[currentClip.syncPos][currEvent] != (Object)null)
			{
				listOfCurrentEmoteAudio[currentClip.syncPos].Add(audioObject.GetComponent<AudioSource>());
			}
		}
		SetAnimationSpeed(1f);
		StartAnimations(animController, pos, emoteSkeletonAnimator);
		if (local && CustomEmotesAPI.hudObject != null)
		{
			if (currentClip.displayName != "")
			{
				((TMP_Text)CustomEmotesAPI.currentEmoteText).text = currentClip.displayName;
			}
			else if (currentClip.customName != "")
			{
				((TMP_Text)CustomEmotesAPI.currentEmoteText).text = currentClip.customName;
			}
			else if (!currentClip.visibility)
			{
				((TMP_Text)CustomEmotesAPI.currentEmoteText).text = "";
			}
			else
			{
				((TMP_Text)CustomEmotesAPI.currentEmoteText).text = currentClipName;
			}
		}
		twopart = false;
		NewAnimation(currentClip.joinSpots);
		CustomEmotesAPI.Changed(s, this);
	}

	public void StartAnimations(AnimatorOverrideController animController, int pos, Animator animator)
	{
		if (currentClip.secondaryClip != null && currentClip.secondaryClip.Length != 0)
		{
			bool flag = true;
			if (CustomAnimationClip.syncTimer[currentClip.syncPos] > currentClip.clip[pos].length)
			{
				animController["Floss"] = currentClip.secondaryClip[pos];
				animator.runtimeAnimatorController = (RuntimeAnimatorController)(object)animController;
				animator.Play("Loop", -1, (CustomAnimationClip.syncTimer[currentClip.syncPos] - currentClip.clip[pos].length) % currentClip.secondaryClip[pos].length / currentClip.secondaryClip[pos].length);
			}
			else
			{
				animController["Dab"] = currentClip.clip[pos];
				animController["nobones"] = currentClip.secondaryClip[pos];
				animator.runtimeAnimatorController = (RuntimeAnimatorController)(object)animController;
				animator.Play("PoopToLoop", -1, CustomAnimationClip.syncTimer[currentClip.syncPos] % currentClip.clip[pos].length / currentClip.clip[pos].length);
			}
		}
		else if (((Motion)currentClip.clip[0]).isLooping)
		{
			animController["Floss"] = currentClip.clip[pos];
			animator.runtimeAnimatorController = (RuntimeAnimatorController)(object)animController;
			if (currentClip.clip[pos].length != 0f)
			{
				animator.Play("Loop", -1, CustomAnimationClip.syncTimer[currentClip.syncPos] % currentClip.clip[pos].length / currentClip.clip[pos].length);
			}
			else
			{
				animator.Play("Loop", -1, 0f);
			}
		}
		else
		{
			animController["Default Dance"] = currentClip.clip[pos];
			animator.runtimeAnimatorController = (RuntimeAnimatorController)(object)animController;
			animator.Play("Poop", -1, CustomAnimationClip.syncTimer[currentClip.syncPos] % currentClip.clip[pos].length / currentClip.clip[pos].length);
		}
	}

	public static void PreviewAnimations(Animator animator, string animation)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Expected O, but got Unknown
		AnimatorOverrideController val = new AnimatorOverrideController(animator.runtimeAnimatorController);
		CustomAnimationClip customAnimationClip = animClips[GetRealAnimationName(animation)];
		if (customAnimationClip != null)
		{
			int num = 0;
			if (customAnimationClip.secondaryClip != null && customAnimationClip.secondaryClip.Length != 0)
			{
				val["Dab"] = customAnimationClip.clip[num];
				val["nobones"] = customAnimationClip.secondaryClip[num];
				animator.runtimeAnimatorController = (RuntimeAnimatorController)(object)val;
				animator.Play("PoopToLoop", -1, 0f);
			}
			else if (((Motion)customAnimationClip.clip[0]).isLooping)
			{
				val["Floss"] = customAnimationClip.clip[num];
				animator.runtimeAnimatorController = (RuntimeAnimatorController)(object)val;
				animator.Play("Loop", -1, 0f);
			}
			else
			{
				val["Default Dance"] = customAnimationClip.clip[num];
				animator.runtimeAnimatorController = (RuntimeAnimatorController)(object)val;
				animator.Play("Poop", -1, 0f);
			}
		}
	}

	public void SetAnimationSpeed(float speed)
	{
		emoteSkeletonAnimator.speed = speed;
	}

	internal void NewAnimation(JoinSpot[] locations)
	{
		//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
		//IL_0102: Unknown result type (might be due to invalid IL or missing references)
		//IL_011d: 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)
		try
		{
			try
			{
				emoteLocations.Clear();
				autoWalkSpeed = 0f;
				autoWalk = false;
				overrideMoveSpeed = false;
				if (Object.op_Implicit((Object)(object)parentGameObject) && !preserveParent)
				{
					parentGameObject = null;
				}
			}
			catch (Exception)
			{
			}
			try
			{
				useSafePositionReset = currentClip.useSafePositionReset;
			}
			catch (Exception)
			{
				useSafePositionReset = true;
			}
			try
			{
				if (preserveParent)
				{
					preserveParent = false;
				}
				else
				{
					mapperBody.gameObject.transform.localEulerAngles = new Vector3(0f, mapperBody.gameObject.transform.localEulerAngles.y, 0f);
					if (ogScale != new Vector3(-69f, -69f, -69f))
					{
						mapperBody.transform.localScale = ogScale;
						ogScale = new Vector3(-69f, -69f, -69f);
					}
					Collider[] componentsInChildren = mapperBody.GetComponentsInChildren<Collider>();
					foreach (Collider val in componentsInChildren)
					{
						val.enabled = true;
					}
					if (Object.op_Implicit((Object)(object)mapperBody.GetComponent<CharacterController>()))
					{
						((Collider)mapperBody.GetComponent<CharacterController>()).enabled = true;
					}
				}
			}
			catch (Exception)
			{
			}
			if (preserveProps)
			{
				preserveProps = false;
			}
			else
			{
				foreach (GameObject prop in props)
				{
					if (Object.op_Implicit((Object)(object)prop))
					{
						Object.Destroy((Object)(object)prop);
					}
				}
				props.Clear();
			}
			if (locations != null)
			{
				for (int j = 0; j < locations.Length; j++)
				{
					SpawnJoinSpot(locations[j]);
				}
			}
		}
		catch (Exception arg)
		{
			DebugClass.Log($"error during new animation: {arg}");
		}
	}

	public void ScaleProps()
	{
		//IL_0067: Unknown result type (might be due to invalid IL or missing references)
		foreach (GameObject prop in props)
		{
			if (Object.op_Implicit((Object)(object)prop))
			{
				Transform parent = prop.transform.parent;
				prop.transform.SetParent((Transform)null);
				prop.transform.localScale = new Vector3(scale * 1.15f, scale * 1.15f, scale * 1.15f);
				prop.transform.SetParent(parent);
			}
		}
	}

	internal IEnumerator preventEmotesInSpawnAnimation()
	{
		yield return (object)new WaitForSeconds(3f);
		canEmote = true;
	}

	private void Start()
	{
		//IL_015a: Unknown result type (might be due to invalid IL or missing references)
		//IL_03e8: Unknown result type (might be due to invalid IL or missing references)
		if (worldProp)
		{
			return;
		}
		if (Object.op_Implicit((Object)(object)((Component)((Component)this).transform).GetComponentInParent<PlayerControllerB>()))
		{
			mapperBody = ((Component)((Component)((Component)this).transform).GetComponentInParent<PlayerControllerB>()).gameObject;
			networkId = (int)((NetworkBehaviour)mapperBody.GetComponent<PlayerControllerB>()).NetworkObjectId;
		}
		else if (Object.op_Implicit((Object)(object)((Component)((Component)this).transform).GetComponentInParent<EnemyAI>()))
		{
			mapperBody = ((Component)((Component)((Component)this).transform).GetComponentInParent<EnemyAI>()).gameObject;
			networkId = -1;
			isEnemy = CustomEmotesAPI.localMapper.isServer;
		}
		else
		{
			networkId = -1;
			mapperBody = ((Component)this).gameObject;
		}
		playerController = mapperBody.GetComponent<PlayerControllerB>();
		if (playerController == null)
		{
			enemyController = mapperBody.GetComponent<EnemyAI>();
		}
		playersToMappers.Add(mapperBody, this);
		mapperBodyTransform = mapperBody.transform;
		allMappers.Add(this);
		GameObject val = Object.Instantiate<GameObject>(Assets.Load<GameObject>("assets/source1.prefab"));
		((Object)val).name = ((Object)this).name + "_AudioObject";
		val.transform.SetParent(mapperBody.transform);
		val.transform.localPosition = Vector3.zero;
		val.AddComponent<SphereCollider>().radius = 0.01f;
		val.layer = 6;
		personalAudioSource = val.GetComponent<AudioSource>();
		val.AddComponent<AudioManager>().Setup(personalAudioSource, this);
		personalAudioSource.playOnAwake = false;
		personalAudioSource.volume = Settings.EmotesVolume.Value / 100f;
		audioObject = val;
		int num = 0;
		if (true)
		{
			SkinnedMeshRenderer[] array = basePlayerModelSMR;
			foreach (SkinnedMeshRenderer val2 in array)
			{
				int num2 = 0;
				for (int j = 0; j < emoteSkeletonSMR.bones.Length; j++)
				{
					for (int k = num2; k < val2.bones.Length; k++)
					{
						if (((Object)emoteSkeletonSMR.bones[j]).name == ((Object)val2.bones[k]).name && !Object.op_Implicit((Object)(object)((Component)val2.bones[k]).gameObject.GetComponent<EmoteConstraint>()))
						{
							num2 = k;
							EmoteConstraint emoteConstraint = ((Component)val2.bones[k]).gameObject.AddComponent<EmoteConstraint>();
							emoteConstraint.AddSource(ref val2.bones[k], ref emoteSkeletonSMR.bones[j]);
							emoteConstraint.revertTransform = revertTransform;
							break;
						}
						if (k == num2 - 1)
						{
							break;
						}
						if (num2 > 0 && k == val2.bones.Length - 1)
						{
							k = -1;
						}
					}
				}
			}
		}
		if (jank)
		{
			SkinnedMeshRenderer[] array2 = basePlayerModelSMR;
			foreach (SkinnedMeshRenderer val3 in array2)
			{
				for (int m = 0; m < val3.bones.Length; m++)
				{
					try
					{
						if (Object.op_Implicit((Object)(object)((Component)val3.bones[m]).gameObject.GetComponent<EmoteConstraint>()))
						{
							((Component)val3.bones[m]).gameObject.GetComponent<EmoteConstraint>().ActivateConstraints();
						}
					}
					catch (Exception arg)
					{
						DebugClass.Log($"{arg}");
					}
				}
			}
		}
		((Component)this).transform.localPosition = Vector3.zero;
		CustomEmotesAPI.MapperCreated(this);
		if (playerController != null)
		{
			((MonoBehaviour)this).StartCoroutine(SetupHandConstraint());
		}
		((MonoBehaviour)this).StartCoroutine(preventEmotesInSpawnAnimation());
	}

	public IEnumerator SetupHandConstraint()
	{
		while (!Object.op_Implicit((Object)(object)CustomEmotesAPI.localMapper))
		{
			yield return (object)new WaitForEndOfFrame();
		}
		itemHolderPosition = ((Component)this).GetComponentInChildren<Animator>().GetBoneTransform((HumanBodyBones)18).Find("ServerItemHolder");
		itemHolderConstraints.Add(EmoteConstraint.AddConstraint(((Component)mapperBody.transform.Find("ScavengerModel/metarig/spine/spine.001/spine.002/spine.003/shoulder.R/arm.R_upper/arm.R_lower/hand.R/ServerItemHolder")).gameObject, this, itemHolderPosition));
		itemHolderConstraints.Add(EmoteConstraint.AddConstraint(((Component)mapperBody.transform.Find("ScavengerModel/metarig/ScavengerModelArmsOnly/metarig/spine.003/shoulder.R/arm.R_upper/arm.R_lower/hand.R/LocalItemHolder")).gameObject, this, itemHolderPosition));
	}

	public void AssignParentGameObject(GameObject youAreTheFather, bool lockPosition, bool lockRotation, bool lockScale, bool scaleAsScavenger = true, bool disableCollider = true)
	{
		//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_0051: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_0048: Unknown result type (might be due to invalid IL or missing references)
		if (Object.op_Implicit((Object)(object)parentGameObject))
		{
			NewAnimation(null);
		}
		ogScale = mapperBody.transform.localScale;
		if (scaleAsScavenger)
		{
			scaleDiff = ogScale / scale;
		}
		else
		{
			scaleDiff = ogScale;
		}
		parentGameObject = youAreTheFather;
		positionLock = lockPosition;
		rotationLock = lockRotation;
		scaleLock = lockScale;
		Collider[] componentsInChildren = mapperBody.GetComponentsInChildren<Collider>();
		foreach (Collider val in componentsInChildren)
		{
			val.enabled = !disableCollider;
		}
		if (Object.op_Implicit((Object)(object)mapperBody.GetComponent<CharacterController>()))
		{
			((Collider)mapperBody.GetComponent<CharacterController>()).enabled = !disableCollider;
		}
		if (disableCollider && Object.op_Implicit((Object)(object)currentEmoteSpot))
		{
			if (currentEmoteSpot.GetComponent<EmoteLocation>().validPlayers != 0)
			{
				currentEmoteSpot.GetComponent<EmoteLocation>().validPlayers--;
			}
			currentEmoteSpot.GetComponent<EmoteLocation>().SetColor();
			currentEmoteSpot = null;
		}
	}

	private void LocalFunctions()
	{
		try
		{
			if (moving && currentClip.stopOnMove)
			{
				CustomEmotesAPI.PlayAnimation("none");
			}
		}
		catch (Exception)
		{
		}
	}

	private void GetLocal()
	{
		//IL_0082: Unknown result type (might be due to invalid IL or missing references)
		//IL_008c: Expected O, but got Unknown
		//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e7: 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_00fd: Expected O, but got Unknown
		//IL_0133: 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_0155: Unknown result type (might be due to invalid IL or missing references)
		//IL_015f: Expected O, but got Unknown
		//IL_0186: Unknown result type (might be due to invalid IL or missing references)
		//IL_019c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0209: Unknown result type (might be due to invalid IL or missing references)
		//IL_0210: Expected O, but got Unknown
		//IL_0239: Unknown result type (might be due to invalid IL or missing references)
		//IL_025a: Unknown result type (might be due to invalid IL or missing references)
		try
		{
			if (!Object.op_Implicit((Object)(object)CustomEmotesAPI.localMapper) && (Object)(object)playerController == (Object)(object)StartOfRound.Instance.localPlayerController)
			{
				CustomEmotesAPI.localMapper = this;
				local = true;
				isServer = ((NetworkBehaviour)playerController).IsServer && ((NetworkBehaviour)playerController).IsOwner;
				HealthbarAnimator.Setup(this);
				Camera gameplayCamera = playerController.gameplayCamera;
				if (gameplayCamera != null)
				{
					rotationPoint = new GameObject();
					rotationPoint.transform.SetParent(((Component)gameplayCamera).transform.parent.parent.parent.parent);
					rotationPoint.transform.localPosition = new Vector3(0f, 0.8f, 0f);
					rotationPoint.transform.localEulerAngles = Vector3.zero;
					desiredCameraPos = new GameObject();
					desiredCameraPos.transform.SetParent(rotationPoint.transform);
					desiredCameraPos.transform.localPosition = new Vector3(0.3f, 1f, -3f);
					desiredCameraPos.transform.localEulerAngles = Vector3.zero;
					realCameraPos = new GameObject();
					realCameraPos.transform.SetParent(desiredCameraPos.transform);
					realCameraPos.transform.localPosition = Vector3.zero;
					realCameraPos.transform.localEulerAngles = Vector3.zero;
					thirdPersonConstraint = EmoteConstraint.AddConstraint(((Component)((Component)gameplayCamera).transform.parent).gameObject, this, realCameraPos.transform);
					thirdPersonConstraint.debug = true;
					cameraConstraints.Add(EmoteConstraint.AddConstraint(((Component)((Component)gameplayCamera).transform.parent).gameObject, this, ((Component)this).GetComponentInChildren<Animator>().GetBoneTransform((HumanBodyBones)10)));
					GameObject val = new GameObject();
					val.transform.SetParent(((Component)gameplayCamera).transform);
					val.transform.localPosition = new Vector3(0.01f, -0.048f, -0.053f);
					val.transform.localEulerAngles = new Vector3(270f, 0f, 0f);
					cameraConstraints.Add(EmoteConstraint.AddConstraint(((Component)StartOfRound.Instance.localPlayerController.localVisor).gameObject, this, val.transform));
				}
			}
		}
		catch (Exception message)
		{
			DebugClass.Log(message);
		}
	}

	private void TwoPartThing()
	{
		//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)
		AnimatorStateInfo currentAnimatorStateInfo = emoteSkeletonAnimator.GetCurrentAnimatorStateInfo(0);
		if (((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("none"))
		{
			if (ranSinceLastAnim)
			{
				return;
			}
			if (twopart)
			{
				ranSinceLastAnim = true;
				if (((Behaviour)emoteSkeletonAnimator).enabled && !jank)
				{
					UnlockBones();
				}
				if (!ragdolling)
				{
					((Behaviour)basePlayerModelAnimator).enabled = true;
					oneFrameAnimatorLeeWay = true;
				}
				((Behaviour)emoteSkeletonAnimator).enabled = false;
				try
				{
					currentClip.clip.ToString();
					CustomEmotesAPI.Changed("none", this);
					NewAnimation(null);
					if (currentClip.syncronizeAnimation || currentClip.syncronizeAudio)
					{
						CustomAnimationClip.syncPlayerCount[currentClip.syncPos]--;
					}
					if ((Object)(object)primaryAudioClips[currentClip.syncPos][currEvent] != (Object)null)
					{
						audioObject.GetComponent<AudioManager>().Stop();
						if ((Object)(object)primaryAudioClips[currentClip.syncPos][currEvent] != (Object)null && currentClip.syncronizeAudio)
						{
							listOfCurrentEmoteAudio[currentClip.syncPos].Remove(audioObject.GetComponent<AudioSource>());
						}
					}
					prevClip = currentClip;
					currentClip = null;
					return;
				}
				catch (Exception)
				{
					return;
				}
			}
			twopart = true;
		}
		else
		{
			twopart = false;
		}
	}

	private void Health()
	{
	}

	private void WorldPropAndParent()
	{
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0053: Unknown result type (might be due to invalid IL or missing references)
		//IL_0074: 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_00e0: 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_0122: Unknown result type (might be due to invalid IL or missing references)
		//IL_0138: Unknown result type (might be due to invalid IL or missing references)
		if (!Object.op_Implicit((Object)(object)parentGameObject))
		{
			return;
		}
		if (positionLock)
		{
			mapperBody.gameObject.transform.position = parentGameObject.transform.position + new Vector3(0f, 1f, 0f);
			mapperBody.transform.position = parentGameObject.transform.position;
			PlayerControllerB obj = playerController;
			if (obj != null)
			{
				obj.ResetFallGravity();
			}
		}
		if (rotationLock)
		{
			mapperBody.transform.rotation = parentGameObject.transform.rotation;
		}
		if (scaleLock)
		{
			mapperBody.transform.localScale = new Vector3(parentGameObject.transform.localScale.x * scaleDiff.x, parentGameObject.transform.localScale.y * scaleDiff.y, parentGameObject.transform.localScale.z * scaleDiff.z);
		}
	}

	private void Update()
	{
		if (!worldProp)
		{
			WorldPropAndParent();
			if (local)
			{
				LocalFunctions();
			}
			else
			{
				GetLocal();
			}
			TwoPartThing();
			Health();
			SetDeltaPosition();
			RootMotion();
			CameraControls();
		}
	}

	internal bool ThirdPersonCheck()
	{
		return !CustomEmotesAPI.LCThirdPersonPresent && currentClip != null && (((currentClip.thirdPerson || Settings.thirdPersonType.Value == ThirdPersonType.All) && Settings.thirdPersonType.Value != ThirdPersonType.None) || temporarilyThirdPerson == TempThirdPerson.on) && canThirdPerson;
	}

	public void CameraControls()
	{
		//IL_0029: 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_004b: 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_005a: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
		//IL_008c: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d6: 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)
		//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
		//IL_0126: Unknown result type (might be due to invalid IL or missing references)
		if (local && isInThirdPerson)
		{
			Ray val = default(Ray);
			((Ray)(ref val))..ctor(emoteSkeletonAnimator.GetBoneTransform((HumanBodyBones)10).position, desiredCameraPos.transform.position - emoteSkeletonAnimator.GetBoneTransform((HumanBodyBones)10).position);
			RaycastHit val2 = default(RaycastHit);
			if (Physics.Raycast(val, ref val2, 10f, 268437761, (QueryTriggerInteraction)1))
			{
				realCameraPos.transform.position = ((Ray)(ref val)).GetPoint(((RaycastHit)(ref val2)).distance - 0.25f);
			}
			else
			{
				realCameraPos.transform.position = ((Ray)(ref val)).GetPoint(10f);
			}
			if (Vector3.Distance(realCameraPos.transform.position, emoteSkeletonAnimator.GetBoneTransform((HumanBodyBones)10).position) > Vector3.Distance(desiredCameraPos.transform.position, emoteSkeletonAnimator.GetBoneTransform((HumanBodyBones)10).position))
			{
				realCameraPos.transform.position = desiredCameraPos.transform.position;
			}
		}
	}

	private void SetDeltaPosition()
	{
		//IL_0008: 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)
		//IL_0013: 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_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_002f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: 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_0045: Unknown result type (might be due to invalid IL or missing references)
		//IL_004a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		deltaPos = ((Component)this).transform.position - prevPosition;
		deltaRot = ((Component)this).transform.rotation * Quaternion.Inverse(prevRotation);
		prevPosition = ((Component)this).transform.position;
		prevRotation = ((Component)this).transform.rotation;
	}

	public void RootMotion()
	{
		//IL_0009: 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)
		//IL_029f: Unknown result type (might be due to invalid IL or missing references)
		//IL_02b1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_0203: Unknown result type (might be due to invalid IL or missing references)
		//IL_0093: Unknown result type (might be due to invalid IL or missing references)
		//IL_0098: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a5: 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_00d3: 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_00f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_0210: Unknown result type (might be due to invalid IL or missing references)
		//IL_0215: Unknown result type (might be due to invalid IL or missing references)
		//IL_0177: Unknown result type (might be due to invalid IL or missing references)
		//IL_0185: Unknown result type (might be due to invalid IL or missing references)
		//IL_018e: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
		//IL_012f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0146: Unknown result type (might be due to invalid IL or missing references)
		//IL_015b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0165: Unknown result type (might be due to invalid IL or missing references)
		//IL_027c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0287: Unknown result type (might be due to invalid IL or missing references)
		//IL_024c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0257: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
		try
		{
			AnimatorStateInfo currentAnimatorStateInfo = emoteSkeletonAnimator.GetCurrentAnimatorStateInfo(0);
			if (((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("none"))
			{
				return;
			}
			if (justSwitched)
			{
				justSwitched = false;
			}
			else
			{
				if (currentClip.lockType != AnimationClipParams.LockType.rootMotion)
				{
					return;
				}
				if (local || isEnemy)
				{
					if (Settings.rootMotionType.Value != RootMotionType.None || isEnemy)
					{
						Vector3 position = ((Component)this).transform.position;
						Quaternion rotation = ((Component)this).transform.rotation;
						mapperBody.transform.position = new Vector3(emoteSkeletonAnimator.GetBoneTransform((HumanBodyBones)7).position.x, mapperBody.transform.position.y, emoteSkeletonAnimator.GetBoneTransform((HumanBodyBones)7).position.z);
						if (isEnemy || !isInThirdPerson)
						{
							mapperBody.transform.eulerAngles = new Vector3(mapperBody.transform.eulerAngles.x, emoteSkeletonAnimator.GetBoneTransform((HumanBodyBones)10).eulerAngles.y, mapperBody.transform.eulerAngles.z);
						}
						((Component)this).transform.position = position;
						((Component)this).transform.rotation = rotation;
						if (positionBeforeRootMotion != new Vector3(69f, 69f, 69f))
						{
							mapperBody.transform.position = positionBeforeRootMotion;
							mapperBody.transform.rotation = rotationBeforeRootMotion;
							positionBeforeRootMotion = new Vector3(69f, 69f, 69f);
						}
					}
					if (deltaPos != Vector3.zero || deltaRot != Quaternion.identity)
					{
						if (isEnemy)
						{
							EmoteNetworker.instance.SyncBoneMapperPos(((NetworkBehaviour)enemyController).NetworkObjectId, ((Component)this).transform.position, ((Component)this).transform.eulerAngles);
						}
						else
						{
							EmoteNetworker.instance.SyncBoneMapperPos(((NetworkBehaviour)playerController).NetworkObjectId, ((Component)this).transform.position, ((Component)this).transform.eulerAngles);
						}
					}
				}
				else
				{
					((Component)this).transform.position = prevMapperPos;
					((Component)this).transform.eulerAngles = prevMapperRot;
				}
			}
		}
		catch (Exception)
		{
		}
	}

	public int SpawnJoinSpot(JoinSpot joinSpot)
	{
		DebugClass.Log("Spawning Join Spot");
		props.Add(Object.Instantiate<GameObject>(Assets.Load<GameObject>("@CustomEmotesAPI_customemotespackage:assets/emotejoiner/JoinVisual.prefab")));
		props[props.Count - 1].transform.SetParent(((Component)this).transform);
		((Object)props[props.Count - 1]).name = joinSpot.name;
		EmoteLocation emoteLocation = props[props.Count - 1].AddComponent<EmoteLocation>();
		emoteLocation.joinSpot = joinSpot;
		emoteLocation.owner = this;
		emoteLocations.Add(emoteLocation);
		return props.Count - 1;
	}

	public void JoinEmoteSpot()
	{
		if (Object.op_Implicit((Object)(object)reservedEmoteSpot))
		{
			if (Object.op_Implicit((Object)(object)currentEmoteSpot))
			{
				if (currentEmoteSpot.GetComponent<EmoteLocation>().validPlayers != 0)
				{
					currentEmoteSpot.GetComponent<EmoteLocation>().validPlayers--;
				}
				currentEmoteSpot.GetComponent<EmoteLocation>().SetColor();
			}
			currentEmoteSpot = reservedEmoteSpot;
			reservedEmoteSpot = null;
		}
		int i;
		for (i = 0; i < ((Component)currentEmoteSpot.transform.parent).GetComponentsInChildren<EmoteLocation>().Length && !((Object)(object)((Component)currentEmoteSpot.transform.parent).GetComponentsInChildren<EmoteLocation>()[i] == (Object)(object)currentEmoteSpot.GetComponent<EmoteLocation>()); i++)
		{
		}
		if (currentEmoteSpot.GetComponent<EmoteLocation>().owner.worldProp)
		{
			EmoteNetworker.instance.SyncJoinSpot(mapperBody.GetComponent<NetworkObject>().NetworkObjectId, currentEmoteSpot.GetComponentInParent<NetworkObject>().NetworkObjectId, worldProp: true, i);
		}
		else
		{
			EmoteNetworker.instance.SyncJoinSpot(mapperBody.GetComponent<NetworkObject>().NetworkObjectId, currentEmoteSpot.GetComponentInParent<NetworkObject>().NetworkObjectId, worldProp: false, i);
		}
	}

	public void RemoveProp(int propPos)
	{
		Object.Destroy((Object)(object)props[propPos]);
	}

	public void SetAutoWalk(float speed, bool overrideBaseMovement, bool autoWalk)
	{
		autoWalkSpeed = speed;
		overrideMoveSpeed = overrideBaseMovement;
		this.autoWalk = autoWalk;
	}

	public void SetAutoWalk(float speed, bool overrideBaseMovement)
	{
		autoWalkSpeed = speed;
		overrideMoveSpeed = overrideBaseMovement;
		autoWalk = true;
	}

	internal IEnumerator waitForTwoFramesThenDisableA1()
	{
		yield return (object)new WaitForEndOfFrame();
	}

	private void OnDestroy()
	{
		playersToMappers.Remove(mapperBody);
		try
		{
			((object)currentClip.clip[0]).ToString();
			NewAnimation(null);
			if ((currentClip.syncronizeAnimation || currentClip.syncronizeAudio) && CustomAnimationClip.syncPlayerCount[currentClip.syncPos] > 0)
			{
				CustomAnimationClip.syncPlayerCount[currentClip.syncPos]--;
			}
			if ((Object)(object)primaryAudioClips[currentClip.syncPos][currEvent] != (Object)null)
			{
				audioObject.GetComponent<AudioManager>().Stop();
				if (currentClip.syncronizeAudio)
				{
					listOfCurrentEmoteAudio[currentClip.syncPos].Remove(audioObject.GetComponent<AudioSource>());
				}
			}
			if (uniqueSpot != -1 && CustomAnimationClip.uniqueAnimations[currentClip.syncPos][uniqueSpot])
			{
				CustomAnimationClip.uniqueAnimations[currentClip.syncPos][uniqueSpot] = false;
				uniqueSpot = -1;
			}
			allMappers.Remove(this);
			prevClip = currentClip;
			currentClip = null;
		}
		catch (Exception)
		{
			allMappers.Remove(this);
		}
	}

	public void UnlockBones(bool animatorEnabled = true)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		((Component)this).transform.localPosition = Vector3.zero;
		((Component)this).transform.eulerAngles = bodyPrefab.transform.eulerAngles;
		SkinnedMeshRenderer[] array = basePlayerModelSMR;
		foreach (SkinnedMeshRenderer val in array)
		{
			for (int j = 0; j < val.bones.Length; j++)
			{
				try
				{
					if (Object.op_Implicit((Object)(object)((Component)val.bones[j]).gameObject.GetComponent<EmoteConstraint>()))
					{
						((Component)val.bones[j]).gameObject.GetComponent<EmoteConstraint>().DeactivateConstraints();
					}
				}
				catch (Exception)
				{
					break;
				}
			}
		}
		foreach (EmoteConstraint cameraConstraint in cameraConstraints)
		{
			cameraConstraint.DeactivateConstraints();
		}
		foreach (EmoteConstraint itemHolderConstraint in itemHolderConstraints)
		{
			itemHolderConstraint.DeactivateConstraints();
		}
		foreach (EmoteConstraint additionalConstraint in additionalConstraints)
		{
			additionalConstraint.DeactivateConstraints();
		}
		if (thirdPersonConstraint != null)
		{
			thirdPersonConstraint.DeactivateConstraints();
		}
		DeThirdPerson();
	}

	public void LockBones()
	{
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0030: Unknown result type (might be due to invalid IL or missing references)
		//IL_0035: Unknown result type (might be due to invalid IL or missing references)
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0058: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
		UnlockBones();
		((Component)this).transform.localPosition = Vector3.zero;
		foreach (HumanBodyBones soloIgnoredBone in currentClip.soloIgnoredBones)
		{
			if (Object.op_Implicit((Object)(object)emoteSkeletonAnimator.GetBoneTransform(soloIgnoredBone)))
			{
				dontAnimateUs.Add(((Object)emoteSkeletonAnimator.GetBoneTransform(soloIgnoredBone)).name);
			}
		}
		foreach (HumanBodyBones rootIgnoredBone in currentClip.rootIgnoredBones)
		{
			if (Object.op_Implicit((Object)(object)emoteSkeletonAnimator.GetBoneTransform(rootIgnoredBone)))
			{
				dontAnimateUs.Add(((Object)emoteSkeletonAnimator.GetBoneTransform(rootIgnoredBone)).name);
			}
			Transform[] componentsInChildren = ((Component)emoteSkeletonAnimator.GetBoneTransform(rootIgnoredBone)).GetComponentsInChildren<Transform>();
			foreach (Transform val in componentsInChildren)
			{
				dontAnimateUs.Add(((Object)val).name);
			}
		}
		if (!jank)
		{
			((Renderer)emoteSkeletonSMR).enabled = true;
			SkinnedMeshRenderer[] array = basePlayerModelSMR;
			foreach (SkinnedMeshRenderer val2 in array)
			{
				for (int k = 0; k < val2.bones.Length; k++)
				{
					try
					{
						if (Object.op_Implicit((Object)(object)((Component)val2.bones[k]).gameObject.GetComponent<EmoteConstraint>()) && !dontAnimateUs.Contains(((Object)val2.bones[k]).name))
						{
							((Component)val2.bones[k]).gameObject.GetComponent<EmoteConstraint>().ActivateConstraints();
						}
						else if (dontAnimateUs.Contains(((Object)val2.bones[k]).name))
						{
							((Component)val2.bones[k]).gameObject.GetComponent<EmoteConstraint>().DeactivateConstraints();
						}
					}
					catch (Exception arg)
					{
						DebugClass.Log($"{arg}");
					}
				}
			}
			foreach (EmoteConstraint itemHolderConstraint in itemHolderConstraints)
			{
				itemHolderConstraint.ActivateConstraints();
			}
			foreach (EmoteConstraint additionalConstraint in additionalConstraints)
			{
				additionalConstraint.ActivateConstraints();
			}
			LockCameraStuff(local && ThirdPersonCheck());
		}
		else
		{
			((MonoBehaviour)this).StartCoroutine(waitForTwoFramesThenDisableA1());
		}
	}

	public void LockCameraStuff(bool thirdPersonLock)
	{
		if (thirdPersonLock)
		{
			TurnOnThirdPerson();
			return;
		}
		if (Settings.rootMotionType.Value != RootMotionType.None && (currentClip.lockType == AnimationClipParams.LockType.rootMotion || Settings.rootMotionType.Value == RootMotionType.All || currentClip.lockType == AnimationClipParams.LockType.lockHead))
		{
			foreach (EmoteConstraint cameraConstraint in cameraConstraints)
			{
				cameraConstraint.ActivateConstraints();
			}
			return;
		}
		if (currentClip.lockType != AnimationClipParams.LockType.headBobbing)
		{
			return;
		}
		foreach (EmoteConstraint cameraConstraint2 in cameraConstraints)
		{
			cameraConstraint2.ActivateConstraints();
			if ((Object)(object)cameraConstraint2 != (Object)(object)cameraConstraints[cameraConstraints.Count - 1])
			{
				cameraConstraint2.onlyY = true;
			}
		}
	}

	public void UnlockCameraStuff()
	{
		foreach (EmoteConstraint cameraConstraint in cameraConstraints)
		{
			cameraConstraint.DeactivateConstraints();
		}
		thirdPersonConstraint.DeactivateConstraints();
		DeThirdPerson();
	}

	public void TurnOnThirdPerson()
	{
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Invalid comparison between Unknown and I4
		((Component)playerController.localVisor).gameObject.SetActive(false);
		if ((int)((Renderer)playerController.thisPlayerModel).shadowCastingMode == 1)
		{
			needToTurnOffShadows = false;
		}
		((Renderer)playerController.thisPlayerModel).shadowCastingMode = (ShadowCastingMode)1;
		((Renderer)playerController.thisPlayerModelArms).shadowCastingMode = (ShadowCastingMode)3;
		if (originalLayer == -1)
		{
			originalLayer = ((Component)playerController.thisPlayerModel).gameObject.layer;
			originalCullingMask = playerController.gameplayCamera.cullingMask;
		}
		((Component)playerController.thisPlayerModel).gameObject.layer = 1;
		playerController.grabDistance = 5.65f;
		playerController.gameplayCamera.cullingMask = playerController.playersManager.spectateCamera.cullingMask;
		Camera gameplayCamera = playerController.gameplayCamera;
		gameplayCamera.cullingMask |= 0x800000;
		thirdPersonConstraint.ActivateConstraints();
		isInThirdPerson = true;
		if (CustomEmotesAPI.MoreCompanyPresent)
		{
			try
			{
				needToTurnOffCosmetics = true;
				MoreCompanyCompat.TurnOnCosmetics(this);
			}
			catch (Exception arg)
			{
				DebugClass.Log($"couldn't turn on cosmetics: {arg}");
			}
		}
	}

	public void DeThirdPerson()
	{
		if (!isInThirdPerson)
		{
			return;
		}
		playerController.gameplayCamera.cullingMask = originalCullingMask;
		if (needToTurnOffShadows)
		{
			((Renderer)playerController.thisPlayerModel).shadowCastingMode = (ShadowCastingMode)3;
		}
		needToTurnOffShadows = true;
		((Renderer)playerController.thisPlayerModelArms).shadowCastingMode = (ShadowCastingMode)1;
		((Component)playerController.localVisor).gameObject.SetActive(true);
		((Component)playerController.thisPlayerModel).gameObject.layer = originalLayer;
		playerController.grabDistance = 3f;
		isInThirdPerson = false;
		if (CustomEmotesAPI.MoreCompanyPresent && needToTurnOffCosmetics)
		{
			try
			{
				MoreCompanyCompat.TurnOffCosmetics(this);
			}
			catch (Exception arg)
			{
				DebugClass.Log($"couldn't clear cosmetics: {arg}");
			}
		}
	}
}
public class CustomAnimationClip : MonoBehaviour
{
	public AnimationClip[] clip;

	public AnimationClip[] secondaryClip;

	public bool looping;

	public string wwiseEvent;

	public bool syncronizeAudio;

	public List<HumanBodyBones> soloIgnoredBones;

	public List<HumanBodyBones> rootIgnoredBones;

	public bool dimAudioWhenClose;

	public bool stopOnAttack;

	public bool stopOnMove;

	public bool visibility;

	public int startPref;

	public int joinPref;

	public JoinSpot[] joinSpots;

	public bool useSafePositionReset;

	public string customName;

	public Action<BoneMapper> customPostEventCodeSync;

	public Action<BoneMapper> customPostEventCodeNoSync;

	public bool syncronizeAnimation;

	public int syncPos;

	public static List<float> syncTimer = new List<float>();

	public static List<int> syncPlayerCount = new List<int>();

	public static List<List<bool>> uniqueAnimations = new List<List<bool>>();

	public bool vulnerableEmote = false;

	public AnimationClipParams.LockType lockType = AnimationClipParams.LockType.none;

	public bool willGetClaimed = false;

	public float audioLevel = 0.5f;

	public bool thirdPerson = false;

	public string displayName = "";

	public BepInPlugin ownerPlugin;

	internal CustomAnimationClip(AnimationClip[] _clip, bool _loop, AudioClip[] primaryAudioClips = null, AudioClip[] secondaryAudioClips = null, HumanBodyBones[] rootBonesToIgnore = null, HumanBodyBones[] soloBonesToIgnore = null, AnimationClip[] _secondaryClip = null, bool dimWhenClose = false, bool stopWhenMove = false, bool stopWhenAttack = false, bool visible = true, bool syncAnim = false, bool syncAudio = false, int startPreference = -1, int joinPreference = -1, JoinSpot[] _joinSpots = null, bool safePositionReset = false, string customName = "", Action<BoneMapper> _customPostEventCodeSync = null, Action<BoneMapper> _customPostEventCodeNoSync = null, AnimationClipParams.LockType lockType = AnimationClipParams.LockType.none, AudioClip[] primaryDMCAFreeAudioClips = null, AudioClip[] secondaryDMCAFreeAudioClips = null, bool willGetClaimed = false, float audioLevel = 0.5f, bool thirdPerson = false, string displayName = "", BepInPlugin ownerPlugin = null)
	{
		if (rootBonesToIgnore == null)
		{
			rootBonesToIgnore = (HumanBodyBones[])(object)new HumanBodyBones[0];
		}
		if (soloBonesToIgnore == null)
		{
			soloBonesToIgnore = (HumanBodyBones[])(object)new HumanBodyBones[0];
		}
		clip = _clip;
		secondaryClip = _secondaryClip;
		looping = _loop;
		dimAudioWhenClose = dimWhenClose;
		stopOnAttack = stopWhenAttack;
		stopOnMove = stopWhenMove;
		visibility = visible;
		joinPref = joinPreference;
		startPref = startPreference;
		customPostEventCodeSync = _customPostEventCodeSync;
		customPostEventCodeNoSync = _customPostEventCodeNoSync;
		if (primaryAudioClips == null)
		{
			BoneMapper.primaryAudioClips.Add((AudioClip[])(object)new AudioClip[1]);
		}
		else
		{
			BoneMapper.primaryAudioClips.Add(primaryAudioClips);
		}
		if (secondaryAudioClips == null)
		{
			BoneMapper.secondaryAudioClips.Add((AudioClip[])(object)new AudioClip[1]);
		}
		else
		{
			BoneMapper.secondaryAudioClips.Add(secondaryAudioClips);
		}
		if (primaryDMCAFreeAudioClips == null)
		{
			BoneMapper.primaryDMCAFreeAudioClips.Add((AudioClip[])(object)new AudioClip[1]);
		}
		else
		{
			BoneMapper.primaryDMCAFreeAudioClips.Add(primaryDMCAFreeAudioClips);
		}
		if (secondaryDMCAFreeAudioClips == null)
		{
			BoneMapper.secondaryDMCAFreeAudioClips.Add((AudioClip[])(object)new AudioClip[1]);
		}
		else
		{
			BoneMapper.secondaryDMCAFreeAudioClips.Add(secondaryDMCAFreeAudioClips);
		}
		if (soloBonesToIgnore.Length != 0)
		{
			soloIgnoredBones = new List<HumanBodyBones>(soloBonesToIgnore);
		}
		else
		{
			soloIgnoredBones = new List<HumanBodyBones>();
		}
		if (rootBonesToIgnore.Length != 0)
		{
			rootIgnoredBones = new List<HumanBodyBones>(rootBonesToIgnore);
		}
		else
		{
			rootIgnoredBones = new List<HumanBodyBones>();
		}
		syncronizeAnimation = syncAnim;
		syncronizeAudio = syncAudio;
		syncPos = syncTimer.Count;
		syncTimer.Add(0f);
		syncPlayerCount.Add(0);
		List<bool> list = new List<bool>();
		for (int i = 0; i < _clip.Length; i++)
		{
			list.Add(item: false);
		}
		uniqueAnimations.Add(list);
		if (_joinSpots == null)
		{
			_joinSpots = new JoinSpot[0];
		}
		joinSpots = _joinSpots;
		useSafePositionReset = safePositionReset;
		this.customName = customName;
		if (customName != "")
		{
			BoneMapper.customNamePairs.Add(customName, ((Object)_clip[0]).name);
		}
		else
		{
			this.customName = ((Object)clip[0]).name;
		}
		BoneMapper.listOfCurrentEmoteAudio.Add(new List<AudioSource>());
		this.lockType = lockType;
		this.willGetClaimed = willGetClaimed;
		this.audioLevel = audioLevel;
		this.thirdPerson = thirdPerson;
		this.displayName = displayName;
		this.ownerPlugin = ownerPlugin;
	}
}
[DefaultExecutionOrder(-2)]
public class EmoteConstraint : MonoBehaviour
{
	public Transform originalBone;

	public Transform emoteBone;

	private Vector3 originalPosition;

	private Quaternion originalRotation;

	public bool constraintActive = false;

	public bool revertTransform;

	private bool firstTime = true;

	private bool firstTime2 = true;

	private bool hasEverActivatedConstraints = false;

	public bool onlyY = false;

	public bool debug = false;

	public bool localTransforms = false;

	private void LateUpdate()
	{
		ActUponConstraints();
	}

	public void ActUponConstraints()
	{
		//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
		//IL_0116: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ba: 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_00da: 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_0079: Unknown result type (might be due to invalid IL or missing references)
		//IL_0090: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: 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_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_005e: Unknown result type (might be due to invalid IL or missing references)
		if (!constraintActive)
		{
			return;
		}
		if (localTransforms)
		{
			if (onlyY)
			{
				originalBone.localPosition = new Vector3(originalBone.localPosition.x, emoteBone.localPosition.y, originalBone.localPosition.z);
				return;
			}
			originalBone.localPosition = emoteBone.localPosition;
			originalBone.localRotation = emoteBone.localRotation;
		}
		else if (onlyY)
		{
			originalBone.position = new Vector3(originalBone.position.x, emoteBone.position.y, originalBone.position.z);
		}
		else
		{
			originalBone.position = emoteBone.position;
			originalBone.rotation = emoteBone.rotation;
		}
	}

	public void ActivateConstraints()
	{
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_0049: Unknown result type (might be due to invalid IL or missing references)
		//IL_0055: Unknown result type (might be due to invalid IL or missing references)
		//IL_005a: Unknown result type (might be due to invalid IL or missing references)
		if (!constraintActive)
		{
			if (firstTime2)
			{
				firstTime2 = false;
				((Component)this).gameObject.GetComponent<MonoBehaviour>().StartCoroutine(FirstTimeActiveFix(this));
				return;
			}
			originalPosition = originalBone.localPosition;
			originalRotation = originalBone.localRotation;
			hasEverActivatedConstraints = true;
			constraintActive = true;
			onlyY = false;
		}
	}

	internal IEnumerator FirstTimeActiveFix(EmoteConstraint e)
	{
		((Behaviour)e).enabled = false;
		yield return (object)new WaitForEndOfFrame();
		((Behaviour)e).enabled = true;
		if (e.onlyY)
		{
			e.ActivateConstraints();
			e.onlyY = true;
		}
		else
		{
			e.ActivateConstraints();
		}
	}

	public void DeactivateConstraints()
	{
		//IL_003b: 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)
		constraintActive = false;
		if (firstTime || !revertTransform || !hasEverActivatedConstraints)
		{
			firstTime = false;
			return;
		}
		originalBone.localPosition = originalPosition;
		originalBone.localRotation = originalRotation;
	}

	internal void AddSource(ref Transform originalBone, ref Transform emoteBone)
	{
		this.originalBone = originalBone;
		this.emoteBone = emoteBone;
	}

	internal void AddSource(Transform originalBone, Transform emoteBone)
	{
		this.originalBone = originalBone;
		this.emoteBone = emoteBone;
	}

	internal static EmoteConstraint AddConstraint(GameObject gameObject, BoneMapper mapper, Transform target)
	{
		EmoteConstraint emoteConstraint = gameObject.AddComponent<EmoteConstraint>();
		emoteConstraint.AddSource(gameObject.transform, target);
		emoteConstraint.revertTransform = mapper.revertTransform;
		return emoteConstraint;
	}
}
public struct JoinSpot
{
	public string name;

	public Vector3 position;

	public Vector3 rotation;

	public Vector3 scale;

	public JoinSpot(string _name, Vector3 _position, Vector3 _rotation, Vector3 _scale)
	{
		//IL_0009: 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_0010: 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_0017: 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)
		name = _name;
		position = _position;
		rotation = _rotation;
		scale = _scale;
	}

	public JoinSpot(string _name, Vector3 _position)
	{
		//IL_0009: 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_0010: 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_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0020: Unknown result type (might be due to invalid IL or missing references)
		name = _name;
		position = _position;
		rotation = Vector3.zero;
		scale = Vector3.one;
	}
}
public class EmoteLocation : MonoBehaviour
{
	public static List<EmoteLocation> emoteLocations = new List<EmoteLocation>();

	public static bool visibile = true;

	public int spot;

	public int validPlayers = 0;

	public BoneMapper owner;

	public BoneMapper emoter;

	public JoinSpot joinSpot;

	public static void HideAllSpots()
	{
		visibile = false;
		foreach (EmoteLocation emoteLocation in emoteLocations)
		{
			try
			{
				Renderer[] componentsInChildren = ((Component)emoteLocation).GetComponentsInChildren<Renderer>();
				foreach (Renderer val in componentsInChildren)
				{
					val.enabled = false;
				}
				ParticleSystemRenderer[] componentsInChildren2 = ((Component)emoteLocation).GetComponentsInChildren<ParticleSystemRenderer>();
				foreach (ParticleSystemRenderer val2 in componentsInChildren2)
				{
					((Renderer)val2).enabled = false;
				}
			}
			catch (Exception)
			{
			}
		}
	}

	public static void ShowAllSpots()
	{
		visibile = true;
		foreach (EmoteLocation emoteLocation in emoteLocations)
		{
			try
			{
				Renderer[] componentsInChildren = ((Component)emoteLocation).GetComponentsInChildren<Renderer>();
				foreach (Renderer val in componentsInChildren)
				{
					val.enabled = true;
				}
				ParticleSystemRenderer[] componentsInChildren2 = ((Component)emoteLocation).GetComponentsInChildren<ParticleSystemRenderer>();
				foreach (ParticleSystemRenderer val2 in componentsInChildren2)
				{
					((Renderer)val2).enabled = true;
				}
			}
			catch (Exception)
			{
			}
		}
	}

	private void Start()
	{
		SetColor();
		emoteLocations.Add(this);
		((MonoBehaviour)this).StartCoroutine(setScale());
		if (!visibile)
		{
			Renderer[] componentsInChildren = ((Component)this).GetComponentsInChildren<Renderer>();
			foreach (Renderer val in componentsInChildren)
			{
				val.enabled = false;
			}
			ParticleSystemRenderer[] componentsInChildren2 = ((Component)this).GetComponentsInChildren<ParticleSystemRenderer>();
			foreach (ParticleSystemRenderer val2 in componentsInChildren2)
			{
				((Renderer)val2).enabled = false;
			}
		}
	}

	private void OnDestroy()
	{
		emoteLocations.Remove(this);
	}

	public void SetEmoterAndHideLocation(BoneMapper boneMapper)
	{
		if (!Object.op_Implicit((Object)(object)emoter))
		{
			emoter = boneMapper;
			SetVisible(visibility: false);
		}
	}

	public IEnumerator setScale()
	{
		yield return (object)new WaitForSeconds(0.1f);
		_ = Vector3.one;
		Vector3 scal = ((!Object.op_Implicit((Object)(object)owner.emoteSkeletonSMR)) ? ((Component)owner).transform.lossyScale : ((Component)owner).transform.parent.lossyScale);
		((Component)this).transform.localPosition = new Vector3(joinSpot.position.x / scal.x, joinSpot.position.y / scal.y, joinSpot.position.z / scal.z);
		((Component)this).transform.localEulerAngles = joinSpot.rotation;
		((Component)this).transform.localScale = new Vector3(joinSpot.scale.x / scal.x, joinSpot.scale.y / scal.y, joinSpot.scale.z / scal.z);
	}

	internal void SetVisible(bool visibility)
	{
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_0058: Unknown result type (might be due to invalid IL or missing references)
		//IL_005d: 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_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)
		if (visibility)
		{
			Transform transform = ((Component)this).gameObject.transform;
			transform.localPosition += new Vector3(5000f, 5000f, 5000f);
		}
		else
		{
			Transform transform2 = ((Component)this).gameObject.transform;
			transform2.localPosition -= new Vector3(5000f, 5000f, 5000f);
		}
	}

	private void OnTriggerEnter(Collider other)
	{
		if (Object.op_Implicit((Object)(object)((Component)other).GetComponentInChildren<BoneMapper>()) && (Object)(object)((Component)other).GetComponentInChildren<BoneMapper>() != (Object)(object)owner)
		{
			BoneMapper componentInChildren = ((Component)other).GetComponentInChildren<BoneMapper>();
			if (Object.op_Implicit((Object)(object)componentInChildren))
			{
				validPlayers++;
				SetColor();
				componentInChildren.currentEmoteSpot = ((Component)this).gameObject;
				CustomEmotesAPI.JoinSpotEntered(componentInChildren, owner);
			}
		}
	}

	private void OnTriggerExit(Collider other)
	{
		if (!Object.op_Implicit((Object)(object)((Component)other).GetComponentInChildren<BoneMapper>()) || !((Object)(object)((Component)other).GetComponentInChildren<BoneMapper>() != (Object)(object)owner))
		{
			return;
		}
		BoneMapper componentInChildren = ((Component)other).GetComponentInChildren<BoneMapper>();
		if (Object.op_Implicit((Object)(object)componentInChildren))
		{
			if (validPlayers != 0)
			{
				validPlayers--;
			}
			SetColor();
			if ((Object)(object)componentInChildren.currentEmoteSpot == (Object)(object)((Component)this).gameObject)
			{
				componentInChildren.currentEmoteSpot = null;
			}
		}
	}

	internal void SetColor()
	{
		//IL_010d: 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_0149: 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_0194: Unknown result type (might be due to invalid IL or missing references)
		//IL_0087: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
		//IL_01de: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00be: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
		if (validPlayers > 0)
		{
			((Component)this).GetComponentsInChildren<Renderer>()[((Component)this).GetComponentsInChildren<Renderer>().Length - 1].material.color = Color.green;
			Renderer[] componentsInChildren = ((Component)this).GetComponentsInChildren<Renderer>();
			foreach (Renderer val in componentsInChildren)
			{
				val.material.SetColor("_EmissionColor", Color.green);
			}
			ParticleSystemRenderer[] componentsInChildren2 = ((Component)this).GetComponentsInChildren<ParticleSystemRenderer>();
			foreach (ParticleSystemRenderer val2 in componentsInChildren2)
			{
				((Renderer)val2).material.SetColor("_EmissionColor", Color.green);
			}
			ParticleSystem[] componentsInChildren3 = ((Component)this).GetComponentsInChildren<ParticleSystem>();
			foreach (ParticleSystem val3 in componentsInChildren3)
			{
				TrailModule trails = val3.trails;
				((TrailModule)(ref trails)).colorOverTrail = MinMaxGradient.op_Implicit(Color.green);
			}
		}
		else
		{
			((Component)this).GetComponentsInChildren<Renderer>()[((Component)this).GetComponentsInChildren<Renderer>().Length - 1].material.color = new Color(0.003921569f, 52f / 85f, 38f / 51f);
			Renderer[] componentsInChildren4 = ((Component)this).GetComponentsInChildren<Renderer>();
			foreach (Renderer val4 in componentsInChildren4)
			{
				val4.material.SetColor("_EmissionColor", new Color(0.003921569f, 52f / 85f, 38f / 51f));
			}
			ParticleSystemRenderer[] componentsInChildren5 = ((Component)this).GetComponentsInChildren<ParticleSystemRenderer>();
			foreach (ParticleSystemRenderer val5 in componentsInChildren5)
			{
				((Renderer)val5).material.SetColor("_EmissionColor", new Color(0.003921569f, 52f / 85f, 38f / 51f));
			}
			ParticleSystem[] componentsInChildren6 = ((Component)this).GetComponentsInChildren<ParticleSystem>();
			foreach (ParticleSystem val6 in componentsInChildren6)
			{
				TrailModule trails2 = val6.trails;
				((TrailModule)(ref trails2)).colorOverTrail = MinMaxGradient.op_Implicit(new Color(0.003921569f, 52f / 85f, 38f / 51f));
			}
		}
	}
}
public class AudioContainer : MonoBehaviour
{
	internal List<GameObject> playingObjects = new List<GameObject>();
}
public class AudioObject : MonoBehaviour
{
	internal int spot;

	internal int playerCount;

	internal GameObject audioObject;

	internal int activeObjectsSpot;
}
public class BonePair
{
	public Transform original;

	public Transform newiginal;

	public BonePair(Transform n, Transform o)
	{
		newiginal = n;
		original = o;
	}

	public void test()
	{
	}
}
public static class DebugClass
{
	private static ManualLogSource Logger;

	public static void SetLogger(ManualLogSource logSource)
	{
		Logger = logSource;
	}

	public static void Log(object message)
	{
		Logger.Log((LogLevel)16, (object)$"{message}");
	}
}
public class EmoteNetworker : NetworkBehaviour
{
	public static EmoteNetworker instance;

	private void Awake()
	{
		((Object)this).name = "Bigma Lalls";
		instance = this;
	}

	public void SyncEmote(ulong playerId, string animation, int pos)
	{
		if (((NetworkBehaviour)this).IsOwner && ((NetworkBehaviour)this).IsServer)
		{
			SyncEmoteToClients(playerId, animation, pos);
		}
		else
		{
			SyncEmoteToServerRpc(playerId, animation, pos);
		}
	}

	public void SyncEmoteToClients(ulong playerId, string animation, int pos)
	{
		GameObject gameObject = ((Component)((NetworkBehaviour)this).GetNetworkObject(playerId)).gameObject;
		if (!Object.op_Implicit((Object)(object)gameObject))
		{
			DebugClass.Log("Body is null!!!");
		}
		int eventNum = -1;
		CustomAnimationClip customAnimationClip = BoneMapper.animClips[animation];
		try
		{
			((object)customAnimationClip.clip[0]).ToString();
			eventNum = Random.Range(0, BoneMapper.primaryAudioClips[customAnimationClip.syncPos].Length);
		}
		catch (Exception)
		{
		}
		SyncEmoteToClientRpc(playerId, animation, pos, eventNum);
	}

	[ClientRpc]
	public void SyncEmoteToClientRpc(ulong playerId, string animation, int pos, int eventNum)
	{
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Invalid comparison between Unknown and I4
		//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fb: Invalid comparison between Unknown and I4
		//IL_005f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0068: Unknown result type (might be due to invalid IL or missing references)
		//IL_006d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0071: Unknown result type (might be due to invalid IL or missing references)
		//IL_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
		NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
		if (networkManager == null || !networkManager.IsListening)
		{
			return;
		}
		if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
		{
			ClientRpcParams val = default(ClientRpcParams);
			FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1218916340u, val, (RpcDelivery)0);
			BytePacker.WriteValueBitPacked(val2, playerId);
			bool flag = animation != null;
			((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives));
			if (flag)
			{
				((FastBufferWriter)(ref val2)).WriteValueSafe(animation, false);
			}
			BytePacker.WriteValueBitPacked(val2, pos);
			BytePacker.WriteValueBitPacked(val2, eventNum);
			((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1218916340u, val, (RpcDelivery)0);
		}
		if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
		{
			GameObject gameObject = ((Component)((NetworkBehaviour)this).GetNetworkObject(playerId)).gameObject;
			if (!Object.op_Implicit((Object)(object)gameObject))
			{
				DebugClass.Log("Body is null!!!");
			}
			BoneMapper componentInChildren = gameObject.GetComponentInChildren<BoneMapper>();
			DebugClass.Log($"Recieved message to play {animation} on client. Playing on {gameObject}");
			componentInChildren.PlayAnim(animation, pos, eventNum);
		}
	}

	[ServerRpc(RequireOwnership = false)]
	public void SyncEmoteToServerRpc(ulong playerId, string animation, int pos)
	{
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Invalid comparison between Unknown and I4
		//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ee: Invalid comparison between Unknown and I4
		//IL_005f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0068: Unknown result type (might be due to invalid IL or missing references)
		//IL_006d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0071: Unknown result type (might be due to invalid IL or missing references)
		//IL_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
		NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
		if (networkManager == null || !networkManager.IsListening)
		{
			return;
		}
		if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
		{
			ServerRpcParams val = default(ServerRpcParams);
			FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1304595851u, val, (RpcDelivery)0);
			BytePacker.WriteValueBitPacked(val2, playerId);
			bool flag = animation != null;
			((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives));
			if (flag)
			{
				((FastBufferWriter)(ref val2)).WriteValueSafe(animation, false);
			}
			BytePacker.WriteValueBitPacked(val2, pos);
			((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1304595851u, val, (RpcDelivery)0);
		}
		if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
		{
			SyncEmoteToClients(playerId, animation, pos);
		}
	}

	public void SyncJoinSpot(ulong playerId, ulong joinSpotId, bool worldProp, int posInArray)
	{
		if (((NetworkBehaviour)this).IsOwner && ((NetworkBehaviour)this).IsServer)
		{
			SyncJoinSpotToClientRpc(playerId, joinSpotId, worldProp, posInArray);
		}
		else
		{
			SyncJoinSpotToServerRpc(playerId, joinSpotId, worldProp, posInArray);
		}
	}

	[ClientRpc]
	public void SyncJoinSpotToClientRpc(ulong playerId, ulong joinSpotId, bool worldProp, int posInArray)
	{
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Invalid comparison between Unknown and I4
		//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d8: Invalid comparison between Unknown and I4
		//IL_005f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0068: Unknown result type (might be due to invalid IL or missing references)
		//IL_006d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0071: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0097: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00be: Unknown result type (might be due to invalid IL or missing references)
		NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
		if (networkManager == null || !networkManager.IsListening)
		{
			return;
		}
		if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
		{
			ClientRpcParams val = default(ClientRpcParams);
			FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(770217386u, val, (RpcDelivery)0);
			BytePacker.WriteValueBitPacked(val2, playerId);
			BytePacker.WriteValueBitPacked(val2, joinSpotId);
			((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref worldProp, default(ForPrimitives));
			BytePacker.WriteValueBitPacked(val2, posInArray);
			((NetworkBehaviour)this).__endSendClientRpc(ref val2, 770217386u, val, (RpcDelivery)0);
		}
		if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
		{
			GameObject gameObject = ((Component)((NetworkBehaviour)this).GetNetworkObject(playerId)).gameObject;
			GameObject gameObject2 = ((Component)((NetworkBehaviour)this).GetNetworkObject(joinSpotId)).gameObject;
			if (!Object.op_Implicit((Object)(object)gameObject))
			{
				DebugClass.Log("Body is null!!!");
			}
			if (!Object.op_Implicit((Object)(object)gameObject2))
			{
				DebugClass.Log("spotObject is null!!!");
			}
			BoneMapper componentInChildren = gameObject.GetComponentInChildren<BoneMapper>();
			componentInChildren.PlayAnim("none", 0);
			componentInChildren.currentEmoteSpot = ((Component)gameObject2.GetComponentsInChildren<EmoteLocation>()[posInArray]).gameObject;
			if (worldProp)
			{
				CustomEmotesAPI.JoinedProp(componentInChildren.currentEmoteSpot, componentInChildren, componentInChildren.currentEmoteSpot.GetComponent<EmoteLocation>().owner);
			}
			else
			{
				CustomEmotesAPI.JoinedBody(componentInChildren.currentEmoteSpot, componentInChildren, componentInChildren.currentEmoteSpot.GetComponent<EmoteLocation>().owner);
			}
		}
	}

	[ServerRpc(RequireOwnership = false)]
	public void SyncJoinSpotToServerRpc(ulong playerId, ulong joinSpotId, bool worldProp, int posInArray)
	{
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Invalid comparison between Unknown and I4
		//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d8: Invalid comparison between Unknown and I4
		//IL_005f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0068: Unknown result type (might be due to invalid IL or missing references)
		//IL_006d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0071: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0097: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00be: Unknown result type (might be due to invalid IL or missing references)
		NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
		if (networkManager != null && networkManager.IsListening)
		{
			if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				ServerRpcParams val = default(ServerRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(711293682u, val, (RpcDelivery)0);
				BytePacker.WriteValueBitPacked(val2, playerId);
				BytePacker.WriteValueBitPacked(val2, joinSpotId);
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref worldProp, default(ForPrimitives));
				BytePacker.WriteValueBitPacked(val2, posInArray);
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 711293682u, val, (RpcDelivery)0);
			}
			if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
			{
				SyncJoinSpotToClientRpc(playerId, joinSpotId, worldProp, posInArray);
			}
		}
	}

	public void SyncBoneMapperPos(ulong playerId, Vector3 pos, Vector3 rot)
	{
		//IL_0027: 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_0019: 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)
		if (((NetworkBehaviour)this).IsOwner && ((NetworkBehaviour)this).IsServer)
		{
			SyncBoneMapperPosToClientRpc(playerId, pos, rot);
		}
		else
		{
			SyncBoneMapperPosToServerRpc(playerId, pos, rot);
		}
	}

	[ClientRpc]
	public void SyncBoneMapperPosToClientRpc(ulong playerId, Vector3 pos, Vector3 rot)
	{
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Invalid comparison between Unknown and I4
		//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bd: Invalid comparison between Unknown and I4
		//IL_005f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0068: Unknown result type (might be due to invalid IL or missing references)
		//IL_006d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0071: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_0124: Unknown result type (might be due to invalid IL or missing references)
		//IL_0125: Unknown result type (might be due to invalid IL or missing references)
		//IL_012b: Unknown result type (might be due to invalid IL or missing references)
		//IL_012c: Unknown result type (might be due to invalid IL or missing references)
		NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
		if (networkManager == null || !networkManager.IsListening)
		{
			return;
		}
		if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
		{
			ClientRpcParams val = default(ClientRpcParams);
			FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1678486976u, val, (RpcDelivery)0);
			BytePacker.WriteValueBitPacked(val2, playerId);
			((FastBufferWriter)(ref val2)).WriteValueSafe(ref pos);
			((FastBufferWriter)(ref val2)).WriteValueSafe(ref rot);
			((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1678486976u, val, (RpcDelivery)0);
		}
		if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
		{
			GameObject gameObject = ((Component)((NetworkBehaviour)this).GetNetworkObject(playerId)).gameObject;
			if (!Object.op_Implicit((Object)(object)gameObject))
			{
				DebugClass.Log("Body is null!!!");
			}
			BoneMapper componentInChildren = gameObject.GetComponentInChildren<BoneMapper>();
			if (!((Object)(object)componentInChildren == (Object)(object)CustomEmotesAPI.localMapper))
			{
				componentInChildren.prevMapperPos = pos;
				componentInChildren.prevMapperRot = rot;
			}
		}
	}

	[ServerRpc(RequireOwnership = false)]
	public void SyncBoneMapperPosToServerRpc(ulong playerId, Vector3 pos, Vector3 rot)
	{
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Invalid comparison between Unknown and I4
		//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bd: Invalid comparison between Unknown and I4
		//IL_005f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0068: Unknown result type (might be due to invalid IL or missing references)
		//IL_006d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0071: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a3: 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_00e6: Unknown result type (might be due to invalid IL or missing references)
		NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
		if (networkManager != null && networkManager.IsListening)
		{
			if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				ServerRpcParams val = default(ServerRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(2977327148u, val, (RpcDelivery)0);
				BytePacker.WriteValueBitPacked(val2, playerId);
				((FastBufferWriter)(ref val2)).WriteValueSafe(ref pos);
				((FastBufferWriter)(ref val2)).WriteValueSafe(ref rot);
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2977327148u, val, (RpcDelivery)0);
			}
			if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
			{
				SyncBoneMapperPosToClientRpc(playerId, pos, rot);
			}
		}
	}

	protected override void __initializeVariables()
	{
		((NetworkBehaviour)this).__initializeVariables();
	}

	[RuntimeInitializeOnLoadMethod]
	internal static void InitializeRPCS_EmoteNetworker()
	{
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Expected O, but got Unknown
		//IL_002c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0036: Expected O, but got Unknown
		//IL_0047: Unknown result type (might be due to invalid IL or missing references)
		//IL_0051: Expected O, but got Unknown
		//IL_0062: Unknown result type (might be due to invalid IL or missing references)
		//IL_006c: Expected O, but got Unknown
		//IL_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0087: Expected O, but got Unknown
		//IL_0098: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a2: Expected O, but got Unknown
		NetworkManager.__rpc_func_table.Add(1218916340u, new RpcReceiveHandler(__rpc_handler_1218916340));
		NetworkManager.__rpc_func_table.Add(1304595851u, new RpcReceiveHandler(__rpc_handler_1304595851));
		NetworkManager.__rpc_func_table.Add(770217386u, new RpcReceiveHandler(__rpc_handler_770217386));
		NetworkManager.__rpc_func_table.Add(711293682u, new RpcReceiveHandler(__rpc_handler_711293682));
		NetworkManager.__rpc_func_table.Add(1678486976u, new RpcReceiveHandler(__rpc_handler_1678486976));
		NetworkManager.__rpc_func_table.Add(2977327148u, new RpcReceiveHandler(__rpc_handler_2977327148));
	}

	private static void __rpc_handler_1218916340(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
	{
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0068: Unknown result type (might be due to invalid IL or missing references)
		//IL_0075: Unknown result type (might be due to invalid IL or missing references)
		//IL_0088: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
		NetworkManager networkManager = target.NetworkManager;
		if (networkManager != null && networkManager.IsListening)
		{
			ulong playerId = default(ulong);
			ByteUnpacker.ReadValueBitPacked(reader, ref playerId);
			bool flag = default(bool);
			((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives));
			string animation = null;
			if (flag)
			{
				((FastBufferReader)(ref reader)).ReadValueSafe(ref animation, false);
			}
			int pos = default(int);
			ByteUnpacker.ReadValueBitPacked(reader, ref pos);
			int eventNum = default(int);
			ByteUnpacker.ReadValueBitPacked(reader, ref eventNum);
			target.__rpc_exec_stage = (__RpcExecStage)2;
			((EmoteNetworker)(object)target).SyncEmoteToClientRpc(playerId, animation, pos, eventNum);
			target.__rpc_exec_stage = (__RpcExecStage)0;
		}
	}

	private static void __rpc_handler_1304595851(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
	{
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0068: Unknown result type (might be due to invalid IL or missing references)
		//IL_007b: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		NetworkManager networkManager = target.NetworkManager;
		if (networkManager != null && networkManager.IsListening)
		{
			ulong playerId = default(ulong);
			ByteUnpacker.ReadValueBitPacked(reader, ref playerId);
			bool flag = default(bool);
			((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives));
			string animation = null;
			if (flag)
			{
				((FastBufferReader)(ref reader)).ReadValueSafe(ref animation, false);
			}
			int pos = default(int);
			ByteUnpacker.ReadValueBitPacked(reader, ref pos);
			target.__rpc_exec_stage = (__RpcExecStage)1;
			((EmoteNetworker)(object)target).SyncEmoteToServerRpc(playerId, animation, pos);
			target.__rpc_exec_stage = (__RpcExecStage)0;
		}
	}

	private static void __rpc_handler_770217386(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
	{
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_0030: Unknown result type (might be due to invalid IL or missing references)
		//IL_0049: 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_0058: Unknown result type (might be due to invalid IL or missing references)
		//IL_006b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0091: Unknown result type (might be due to invalid IL or missing references)
		NetworkManager networkManager = target.NetworkManager;
		if (networkManager != null && networkManager.IsListening)
		{
			ulong playerId = default(ulong);
			ByteUnpacker.ReadValueBitPacked(reader, ref playerId);
			ulong joinSpotId = default(ulong);
			ByteUnpacker.ReadValueBitPacked(reader, ref joinSpotId);
			bool worldProp = default(bool);
			((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref worldProp, default(ForPrimitives));
			int posInArray = default(int);
			ByteUnpacker.ReadValueBitPacked(reader, ref posInArray);
			target.__rpc_exec_stage = (__RpcExecStage)2;
			((EmoteNetworker)(object)target).SyncJoinSpotToClientRpc(playerId, joinSpotId, worldProp, posInArray);
			target.__rpc_exec_stage = (__RpcExecStage)0;
		}
	}

	private static void __rpc_handler_711293682(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
	{
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_0030: Unknown result type (might be due to invalid IL or missing references)
		//IL_0049: 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_0058: Unknown result type (might be du

plugins/Gemumoddo-LethalEmotesAPI/LethalEmotesApi.Ui.dll

Decompiled 6 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text;
using LethalEmotesApi.Ui.Animation;
using LethalEmotesApi.Ui.Customize;
using LethalEmotesApi.Ui.Customize.DragDrop;
using LethalEmotesApi.Ui.Customize.Preview;
using LethalEmotesApi.Ui.Customize.Wheel;
using LethalEmotesApi.Ui.Data;
using LethalEmotesApi.Ui.Db;
using LethalEmotesApi.Ui.Elements;
using LethalEmotesApi.Ui.Wheel;
using Microsoft.CodeAnalysis;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("LethalEmotesApi.Ui")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+6824dbf199dd246b0a2833650efb755f5c661453")]
[assembly: AssemblyProduct("LethalEmotesApi.Ui")]
[assembly: AssemblyTitle("LethalEmotesApi.Ui")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

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

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

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace LethalEmotesApi.Ui
{
	internal static class DebugUtils
	{
		public static string ToPrettyString<T>(this IEnumerable<T> enumerable)
		{
			StringBuilder stringBuilder = new StringBuilder();
			int num = 0;
			stringBuilder.AppendLine("{");
			num++;
			int num2 = 0;
			foreach (T item in enumerable)
			{
				if (item != null)
				{
					for (int i = 0; i < num; i++)
					{
						stringBuilder.Append("    ");
					}
					stringBuilder.AppendLine($"[{num2}]: {item.ToString()}");
					num2++;
				}
			}
			stringBuilder.AppendLine("}");
			return stringBuilder.ToString();
		}
	}
	public static class EmoteUiManager
	{
		internal static IEmoteUiStateController? _stateController;

		internal static EmoteUiPanel? EmoteUiInstance;

		internal static IReadOnlyCollection<string> EmoteKeys => _stateController.EmoteDb.EmoteKeys;

		internal static IReadOnlyCollection<string> RandomPoolBlacklist => _stateController.RandomPoolBlacklist;

		public static float EmoteVolume
		{
			get
			{
				return _stateController.EmoteVolume;
			}
			set
			{
				_stateController.EmoteVolume = value;
			}
		}

		public static bool HideJoinSpots
		{
			get
			{
				return _stateController.HideJoinSpots;
			}
			set
			{
				_stateController.HideJoinSpots = value;
			}
		}

		public static int RootMotionType
		{
			get
			{
				return _stateController.RootMotionType;
			}
			set
			{
				_stateController.RootMotionType = value;
			}
		}

		public static bool EmotesAlertEnemies
		{
			get
			{
				return _stateController.EmotesAlertEnemies;
			}
			set
			{
				_stateController.EmotesAlertEnemies = value;
			}
		}

		public static int DmcaFree
		{
			get
			{
				return _stateController.DmcaFree;
			}
			set
			{
				_stateController.DmcaFree = value;
			}
		}

		public static int ThirdPerson
		{
			get
			{
				return _stateController.ThirdPerson;
			}
			set
			{
				_stateController.ThirdPerson = value;
			}
		}

		public static void RegisterStateController(IEmoteUiStateController stateController)
		{
			_stateController = stateController;
		}

		public static IEmoteUiStateController? GetStateController()
		{
			return _stateController;
		}

		internal static void PlayEmote(string emoteKey)
		{
			try
			{
				_stateController?.PlayEmote(emoteKey);
			}
			catch
			{
				Debug.Log((object)"Emote selected might not exist");
			}
		}

		internal static void LockMouseInput()
		{
			_stateController?.LockMouseInput();
		}

		internal static void UnlockMouseInput()
		{
			_stateController?.UnlockMouseInput();
		}

		internal static void LockPlayerInput()
		{
			_stateController?.LockPlayerInput();
		}

		internal static void UnlockPlayerInput()
		{
			_stateController?.UnlockPlayerInput();
		}

		internal static void PlayAnimationOn(Animator animator, string emoteKey)
		{
			_stateController?.PlayAnimationOn(animator, emoteKey);
		}

		internal static string GetEmoteName(string emoteKey)
		{
			return _stateController.EmoteDb.GetEmoteName(emoteKey);
		}

		internal static string GetEmoteModName(string emoteKey)
		{
			return _stateController.EmoteDb.GetModName(emoteKey);
		}

		internal static void AddToRandomPoolBlacklist(string emoteKey)
		{
			_stateController?.AddToRandomPoolBlacklist(emoteKey);
		}

		internal static void RemoveFromRandomPoolBlacklist(string emoteKey)
		{
			_stateController?.RemoveFromRandomPoolBlacklist(emoteKey);
		}

		internal static EmoteWheelSetData LoadEmoteWheelSetData()
		{
			return _stateController.LoadEmoteWheelSetData();
		}

		internal static void SaveEmoteWheelSetData(EmoteWheelSetData dataToSave)
		{
			_stateController.SaveEmoteWheelSetData(dataToSave);
			if (EmoteUiInstance != null)
			{
				EmoteUiInstance.ReloadData();
			}
		}

		public static bool IsEmoteWheelsOpen()
		{
			EmoteUiPanel emoteUiInstance = EmoteUiInstance;
			return emoteUiInstance != null && emoteUiInstance.IsOpen && emoteUiInstance.CurrentView == EmoteUiPanel.UiView.EmoteWheels;
		}

		public static bool IsCustomizePanelOpen()
		{
			EmoteUiPanel emoteUiInstance = EmoteUiInstance;
			return emoteUiInstance != null && emoteUiInstance.IsOpen && emoteUiInstance.CurrentView == EmoteUiPanel.UiView.Customize;
		}

		public static bool CanOpenEmoteWheels()
		{
			if (_stateController == null)
			{
				return false;
			}
			return _stateController.CanOpenEmoteUi() && !IsCustomizePanelOpen();
		}

		public static void OnLeftWheel()
		{
			if (EmoteUiInstance != null && EmoteUiInstance.emoteWheelsController != null && IsEmoteWheelsOpen())
			{
				EmoteUiInstance.emoteWheelsController.PrevWheel();
			}
		}

		public static void OnRightWheel()
		{
			if (EmoteUiInstance != null && EmoteUiInstance.emoteWheelsController != null && IsEmoteWheelsOpen())
			{
				EmoteUiInstance.emoteWheelsController.NextWheel();
			}
		}

		public static void OpenEmoteWheels()
		{
			if (EmoteUiInstance != null && CanOpenEmoteWheels())
			{
				EmoteUiInstance.Show();
			}
		}

		public static void CloseEmoteWheels()
		{
			if (EmoteUiInstance != null && IsEmoteWheelsOpen())
			{
				EmoteUiInstance.Hide();
			}
		}

		public static void CloseCustomizationPanel()
		{
			if (EmoteUiInstance != null && IsCustomizePanelOpen())
			{
				EmoteUiInstance.Hide();
			}
		}

		public static void CloseUiGracefully()
		{
			CloseCustomizationPanel();
			if (EmoteUiInstance != null && IsEmoteWheelsOpen())
			{
				EmoteUiInstance.CloseGracefully();
			}
		}
	}
	public class EmoteUiPanel : MonoBehaviour
	{
		internal enum UiView
		{
			EmoteWheels,
			Customize
		}

		public EmoteWheelsController? emoteWheelsController;

		public CustomizePanel? customizePanel;

		public RectTransform? customizeButton;

		private TextMeshProUGUI? _customizeButtonLabel;

		public bool IsOpen { get; private set; }

		internal UiView CurrentView { get; private set; } = UiView.EmoteWheels;


		private void Awake()
		{
			EmoteUiManager.EmoteUiInstance = this;
			if (customizeButton != null && _customizeButtonLabel == null)
			{
				_customizeButtonLabel = ((Component)customizeButton).GetComponentInChildren<TextMeshProUGUI>();
			}
		}

		private void OnEnable()
		{
			if (customizeButton != null && _customizeButtonLabel == null)
			{
				_customizeButtonLabel = ((Component)customizeButton).GetComponentInChildren<TextMeshProUGUI>();
			}
		}

		public void ReloadData()
		{
			if (emoteWheelsController != null)
			{
				emoteWheelsController.ReloadWheels();
			}
		}

		public void Show()
		{
			CurrentView = UiView.EmoteWheels;
			UpdateCustomizeButton();
			ShowCustomizeButton();
			ShowEmoteWheels();
			EmoteUiManager.LockMouseInput();
			IsOpen = true;
		}

		public void Hide()
		{
			HideCustomizePanel();
			HideCustomizeButton();
			HideEmoteWheels();
			CurrentView = UiView.EmoteWheels;
			EmoteUiManager.UnlockMouseInput();
			EmoteUiManager.UnlockPlayerInput();
			IsOpen = false;
		}

		public void CloseGracefully()
		{
			HideCustomizePanel();
			HideCustomizeButton();
			CloseEmoteWheelsGracefully();
			CurrentView = UiView.EmoteWheels;
		}

		public void ToggleCustomizePanel()
		{
			if (emoteWheelsController != null)
			{
				if (CurrentView == UiView.EmoteWheels)
				{
					CloseEmoteWheelsGracefully();
					ShowCustomizePanel();
					CurrentView = UiView.Customize;
					EmoteUiManager.LockPlayerInput();
				}
				else if (CurrentView == UiView.Customize)
				{
					Hide();
				}
				UpdateCustomizeButton();
			}
		}

		public void ShowEmoteWheels()
		{
			if (emoteWheelsController != null)
			{
				emoteWheelsController.Show();
				((Component)emoteWheelsController.wheelLabel).gameObject.SetActive(true);
			}
		}

		public void HideEmoteWheels()
		{
			if (emoteWheelsController != null)
			{
				emoteWheelsController.Hide();
				((Component)emoteWheelsController.wheelLabel).gameObject.SetActive(false);
			}
		}

		public void CloseEmoteWheelsGracefully()
		{
			if (emoteWheelsController != null)
			{
				emoteWheelsController.CloseGracefully();
				((Component)emoteWheelsController.wheelLabel).gameObject.SetActive(false);
			}
		}

		public void ShowCustomizePanel()
		{
			if (customizePanel != null)
			{
				((Component)customizePanel).gameObject.SetActive(true);
			}
		}

		public void HideCustomizePanel()
		{
			if (customizePanel != null)
			{
				customizePanel.dragDropController.CancelDrag();
				((Component)customizePanel).gameObject.SetActive(false);
				EmoteUiManager.UnlockPlayerInput();
				EmoteUiManager.UnlockMouseInput();
			}
		}

		public void ShowCustomizeButton()
		{
			if (customizeButton != null)
			{
				((Component)customizeButton).gameObject.SetActive(true);
			}
		}

		public void HideCustomizeButton()
		{
			if (customizeButton != null)
			{
				((Component)customizeButton).gameObject.SetActive(false);
			}
		}

		private void UpdateCustomizeButton()
		{
			if (_customizeButtonLabel != null)
			{
				((TMP_Text)_customizeButtonLabel).SetText((CurrentView == UiView.EmoteWheels) ? "Customize" : "Close", true);
			}
		}

		private void OnDestroy()
		{
			EmoteUiManager.EmoteUiInstance = null;
		}
	}
	[ExecuteAlways]
	public class WheelSegmentGen : MonoBehaviour
	{
		public Material segmentMat;

		public ColorBlock colorBlock;

		[Range(1f, 20f)]
		public int segments = 8;

		[Range(-90f, 90f)]
		public float offset;

		[Range(0f, 700f)]
		public float maxRadius = 300f;

		[Range(0f, 699f)]
		public float minRadius = 100f;

		private void OnDrawGizmos()
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: 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_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			if (minRadius >= maxRadius)
			{
				minRadius = maxRadius - 1f;
			}
			Vector3 position = ((Component)this).transform.position;
			float num = (float)(Math.PI * 2.0 / (double)segments);
			Vector3 val = default(Vector3);
			Vector3 val2 = default(Vector3);
			for (int i = 0; i < segments; i++)
			{
				float num2 = (float)i * num + MathF.PI / 180f * offset;
				float num3 = ((float)i * num + (float)(i + 1) * num) / 2f + MathF.PI / 180f * offset;
				float num4 = (float)((double)position.x + Math.Cos(num2) * (double)maxRadius);
				float num5 = (float)((double)position.y + Math.Sin(num2) * (double)maxRadius);
				float num6 = (float)((double)position.x + Math.Cos(num2) * (double)minRadius);
				float num7 = (float)((double)position.y + Math.Sin(num2) * (double)minRadius);
				((Vector3)(ref val))..ctor(num6, num7, position.z);
				((Vector3)(ref val2))..ctor(num4, num5, position.z);
				Gizmos.DrawLine(val, val2);
			}
		}
	}
}
namespace LethalEmotesApi.Ui.Wheel
{
	[RequireComponent(typeof(CanvasGroup))]
	public class EmoteWheel : MonoBehaviour, IPointerMoveHandler, IEventSystemHandler
	{
		private class EmoteSelectedCallback : UnityEvent<string>
		{
		}

		private readonly TweenRunner<AnimCurveTween<Vector3Tween>> _posTweenRunner = new TweenRunner<AnimCurveTween<Vector3Tween>>();

		private readonly TweenRunner<AnimCurveTween<FloatTween>> _alphaTweenRunner = new TweenRunner<AnimCurveTween<FloatTween>>();

		private readonly DelayedActionRunner<DelayedAction> _delayedActionRunner = new DelayedActionRunner<DelayedAction>();

		public CanvasGroup? canvasGroup;

		public WheelStopEmote? wheelStopEmote;

		public ColorBlock colors;

		[Range(1f, 2f)]
		public float scaleMultiplier;

		public int segmentCount = 8;

		public float segmentRotOffset = 22.5f;

		public float minRadius = 100f;

		public float maxRadius = 300f;

		public List<EmoteWheelSegment> wheelSegments = new List<EmoteWheelSegment>();

		public string[] emoteArray;

		private int _currentSegmentIndex = -1;

		private RectTransform? _rectTransform;

		private readonly EmoteSelectedCallback _emoteSelectedCallback = new EmoteSelectedCallback();

		private bool _focused;

		public bool Focused
		{
			get
			{
				return _focused;
			}
			set
			{
				_focused = value;
				foreach (EmoteWheelSegment wheelSegment in wheelSegments)
				{
					wheelSegment.focused = _focused;
				}
				if (!_focused)
				{
					((UnityEventBase)_emoteSelectedCallback).RemoveAllListeners();
				}
			}
		}

		protected EmoteWheel()
		{
			emoteArray = new string[segmentCount];
			_posTweenRunner.Init((MonoBehaviour)(object)this);
			_alphaTweenRunner.Init((MonoBehaviour)(object)this);
			_delayedActionRunner.Init((MonoBehaviour)(object)this);
		}

		private void Awake()
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			_rectTransform = ((Component)this).GetComponent<RectTransform>();
			if (canvasGroup == null)
			{
				canvasGroup = ((Component)this).GetComponent<CanvasGroup>();
			}
			foreach (EmoteWheelSegment wheelSegment in wheelSegments)
			{
				wheelSegment.colors = colors;
				wheelSegment.scaleMultiplier = scaleMultiplier;
				wheelSegment.targetGraphic.segmentCount = segmentCount;
				wheelSegment.targetGraphic.segmentRotOffset = segmentRotOffset;
				wheelSegment.targetGraphic.minRadius = minRadius;
				wheelSegment.targetGraphic.maxRadius = maxRadius;
				wheelSegment.ResetState();
			}
		}

		private void OnEnable()
		{
			ResetState();
		}

		public void OnPointerMove(PointerEventData eventData)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: 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)
			if (!_focused)
			{
				return;
			}
			Vector2 val = default(Vector2);
			RectTransformUtility.ScreenPointToLocalPointInRectangle(_rectTransform, eventData.position, eventData.enterEventCamera, ref val);
			Rect rect = _rectTransform.rect;
			float num = Vector2.Distance(Vector2.zero, val);
			if (num < minRadius)
			{
				DeSelectAll();
				((UnityEvent<string>)(object)_emoteSelectedCallback).Invoke("none");
				wheelStopEmote.OnPointerEnter(eventData);
				return;
			}
			if (val.x > ((Rect)(ref rect)).xMax || val.x < ((Rect)(ref rect)).xMin || val.y > ((Rect)(ref rect)).yMax || val.y < ((Rect)(ref rect)).yMin)
			{
				DeSelectAll();
				((UnityEvent<string>)(object)_emoteSelectedCallback).Invoke("");
				return;
			}
			int closestSegmentIndex = GetClosestSegmentIndex(val);
			if (closestSegmentIndex != _currentSegmentIndex)
			{
				wheelStopEmote.OnPointerExit(eventData);
				if (_currentSegmentIndex > -1)
				{
					wheelSegments[_currentSegmentIndex].OnPointerExit(eventData);
				}
				_currentSegmentIndex = closestSegmentIndex;
				wheelSegments[closestSegmentIndex].OnPointerEnter(eventData);
				((UnityEvent<string>)(object)_emoteSelectedCallback).Invoke(emoteArray[_currentSegmentIndex]);
			}
		}

		public void DeSelectAll()
		{
			_currentSegmentIndex = -1;
			foreach (EmoteWheelSegment wheelSegment in wheelSegments)
			{
				wheelSegment.DeSelect();
			}
		}

		public void ResetState()
		{
			_currentSegmentIndex = -1;
			foreach (EmoteWheelSegment wheelSegment in wheelSegments)
			{
				wheelSegment.ResetState();
			}
			_posTweenRunner.StopTween();
			_alphaTweenRunner.StopTween();
			_delayedActionRunner.StopAction();
			canvasGroup.alpha = 1f;
		}

		public void LoadEmotes(string[] emotes)
		{
			emoteArray = emotes;
			for (int i = 0; i < emoteArray.Length; i++)
			{
				wheelSegments[i].targetLabel?.SetEmote(emoteArray[i]);
			}
		}

		private int GetClosestSegmentIndex(Vector2 mousePos)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: 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)
			int result = -1;
			float num = float.MaxValue;
			for (int i = 0; i < wheelSegments.Count; i++)
			{
				EmoteWheelSegment emoteWheelSegment = wheelSegments[i];
				Vector2 val = Vector2.op_Implicit(((Transform)emoteWheelSegment.segmentRectTransform).position - ((Transform)_rectTransform).position);
				float num2 = Vector2.Distance(val, mousePos);
				if (num2 < num)
				{
					num = num2;
					result = i;
				}
			}
			return result;
		}

		public void AddOnEmoteSelectedCallback(UnityAction<string> callback)
		{
			((UnityEvent<string>)(object)_emoteSelectedCallback).AddListener(callback);
		}

		public void TweenPos(Vector3 targetPos, AnimationCurve curve, float duration, bool ignoreTimeScale)
		{
			//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_003e: 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)
			if (((Component)this).transform.localPosition == targetPos)
			{
				_posTweenRunner.StopTween();
				return;
			}
			Vector3Tween vector3Tween = default(Vector3Tween);
			vector3Tween.Duration = duration;
			vector3Tween.StartValue = ((Component)this).transform.localPosition;
			vector3Tween.TargetValue = targetPos;
			vector3Tween.IgnoreTimeScale = ignoreTimeScale;
			Vector3Tween wrappedTweenValue = vector3Tween;
			wrappedTweenValue.AddOnChangedCallback(TweenPosChanged);
			AnimCurveTween<Vector3Tween> animCurveTween = default(AnimCurveTween<Vector3Tween>);
			animCurveTween.WrappedTweenValue = wrappedTweenValue;
			animCurveTween.Curve = curve;
			AnimCurveTween<Vector3Tween> tweenValue = animCurveTween;
			_posTweenRunner.StartTween(tweenValue);
		}

		private void TweenPosChanged(Vector3 pos)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			((Component)this).transform.localPosition = pos;
		}

		public void TweenAlpha(float targetAlpha, AnimationCurve curve, float duration, bool ignoreTimeScale)
		{
			if (canvasGroup != null)
			{
				if (canvasGroup.alpha == targetAlpha)
				{
					_alphaTweenRunner.StopTween();
					return;
				}
				FloatTween floatTween = default(FloatTween);
				floatTween.Duration = duration;
				floatTween.StartValue = canvasGroup.alpha;
				floatTween.TargetValue = targetAlpha;
				floatTween.IgnoreTimeScale = ignoreTimeScale;
				FloatTween wrappedTweenValue = floatTween;
				wrappedTweenValue.AddOnChangedCallback(TweenAlphaChanged);
				AnimCurveTween<FloatTween> animCurveTween = default(AnimCurveTween<FloatTween>);
				animCurveTween.WrappedTweenValue = wrappedTweenValue;
				animCurveTween.Curve = curve;
				AnimCurveTween<FloatTween> tweenValue = animCurveTween;
				_alphaTweenRunner.StartTween(tweenValue);
			}
		}

		private void TweenAlphaChanged(float alpha)
		{
			canvasGroup.alpha = alpha;
		}

		public void DisableAfterDuration(float duration, bool ignoreTimeScale)
		{
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Expected O, but got Unknown
			if (!((Component)this).gameObject.activeInHierarchy)
			{
				_delayedActionRunner.StopAction();
				return;
			}
			DelayedAction delayedAction = default(DelayedAction);
			delayedAction.Duration = duration;
			delayedAction.IgnoreTimeScale = ignoreTimeScale;
			delayedAction.Action = new UnityAction(DelayedDisable);
			DelayedAction delayedAction2 = delayedAction;
			_delayedActionRunner.StartAction(delayedAction2);
		}

		private void DelayedDisable()
		{
			((Component)this).gameObject.SetActive(false);
		}
	}
	public class EmoteWheelsController : MonoBehaviour
	{
		public GameObject? wheelPrefab;

		public RectTransform? wheelContainer;

		public TextMeshProUGUI? wheelLabel;

		public float fadeDist = 500f;

		public float fadeDuration = 0.5f;

		public AnimationCurve? fadeCurve;

		private EmoteWheel[] _wheels = Array.Empty<EmoteWheel>();

		private int _currentWheelIndex;

		private string _selectedEmote = "";

		private bool _wheelLock;

		private EmoteWheelSetData WheelSetData => EmoteUiManager.LoadEmoteWheelSetData();

		public void Start()
		{
			InitWheels();
		}

		private void OnEnable()
		{
			ReloadWheels();
		}

		public void ReloadWheels()
		{
			if (WheelSetData.EmoteWheels.Length != _wheels.Length)
			{
				EmoteWheel[] wheels = _wheels;
				foreach (EmoteWheel emoteWheel in wheels)
				{
					Object.DestroyImmediate((Object)(object)((Component)emoteWheel).gameObject);
				}
				InitWheels();
			}
			else
			{
				for (int j = 0; j < _wheels.Length; j++)
				{
					EmoteWheel emoteWheel2 = _wheels[j];
					EmoteWheelData emoteWheelData = WheelSetData.EmoteWheels[j];
					((Component)emoteWheel2).gameObject.SetActive(true);
					emoteWheel2.LoadEmotes(emoteWheelData.Emotes);
				}
			}
		}

		public void LockWheels()
		{
			_wheelLock = true;
			if (_currentWheelIndex >= 0)
			{
				_wheels[_currentWheelIndex].DeSelectAll();
			}
		}

		public void UnlockWheels()
		{
			_wheelLock = false;
		}

		private void InitWheels()
		{
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			if (wheelPrefab == null || wheelContainer == null)
			{
				return;
			}
			int num = WheelSetData.EmoteWheels.Length;
			if (_wheels.Length != num)
			{
				_wheels = new EmoteWheel[num];
				for (int i = 0; i < _wheels.Length; i++)
				{
					GameObject val = Object.Instantiate<GameObject>(wheelPrefab, (Transform)(object)wheelContainer);
					val.transform.localPosition = Vector3.zero;
					EmoteWheel component = val.GetComponent<EmoteWheel>();
					EmoteWheelData emoteWheelData = WheelSetData.EmoteWheels[i];
					component.LoadEmotes(emoteWheelData.Emotes);
					component.Focused = false;
					((Component)component).gameObject.SetActive(false);
					_wheels[i] = component;
				}
				_currentWheelIndex = 0;
				int num2 = WheelSetData.IndexOfDefault();
				if (num2 >= 0)
				{
					_currentWheelIndex = num2;
				}
				UpdateWheelState();
			}
		}

		public void NextWheel()
		{
			if (!_wheelLock)
			{
				int currentWheelIndex = _currentWheelIndex;
				_currentWheelIndex++;
				if (_currentWheelIndex >= _wheels.Length)
				{
					_currentWheelIndex = 0;
				}
				EmoteWheel emoteWheel = _wheels[currentWheelIndex];
				emoteWheel.Focused = false;
				emoteWheel.DeSelectAll();
				FadeWheelLeft(currentWheelIndex);
				UpdateWheelState();
			}
		}

		public void PrevWheel()
		{
			if (!_wheelLock)
			{
				int currentWheelIndex = _currentWheelIndex;
				_currentWheelIndex--;
				if (_currentWheelIndex < 0)
				{
					_currentWheelIndex = _wheels.Length - 1;
				}
				EmoteWheel emoteWheel = _wheels[currentWheelIndex];
				emoteWheel.Focused = false;
				emoteWheel.DeSelectAll();
				FadeWheelRight(currentWheelIndex);
				UpdateWheelState();
			}
		}

		public void Show()
		{
			UnlockWheels();
			if (wheelContainer != null)
			{
				int num = WheelSetData.IndexOfDefault();
				if (num >= 0)
				{
					_currentWheelIndex = num;
				}
				EmoteWheel currentWheel = GetCurrentWheel();
				((Component)currentWheel).gameObject.SetActive(true);
				((Component)wheelContainer).gameObject.SetActive(true);
				if (wheelLabel != null)
				{
					((Component)wheelLabel).gameObject.SetActive(true);
					UpdateWheelState();
				}
			}
		}

		public void Hide()
		{
			UnlockWheels();
			if (wheelContainer == null)
			{
				return;
			}
			EmoteWheel[] wheels = _wheels;
			foreach (EmoteWheel emoteWheel in wheels)
			{
				((Component)emoteWheel).gameObject.SetActive(false);
			}
			((Component)wheelContainer).gameObject.SetActive(false);
			if (!string.IsNullOrEmpty(_selectedEmote))
			{
				EmoteUiManager.PlayEmote(_selectedEmote);
				_selectedEmote = "none";
				if (wheelLabel != null)
				{
					((Component)wheelLabel).gameObject.SetActive(false);
				}
			}
		}

		public void CloseGracefully()
		{
			if (wheelContainer != null)
			{
				EmoteWheel[] wheels = _wheels;
				foreach (EmoteWheel emoteWheel in wheels)
				{
					((Component)emoteWheel).gameObject.SetActive(false);
				}
				((Component)wheelContainer).gameObject.SetActive(false);
				_selectedEmote = "";
				if (wheelLabel != null)
				{
					((Component)wheelLabel).gameObject.SetActive(false);
				}
			}
		}

		private EmoteWheel GetCurrentWheel()
		{
			return _wheels[_currentWheelIndex];
		}

		private void UpdateWheelState()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			EmoteWheel currentWheel = GetCurrentWheel();
			((Component)currentWheel).gameObject.SetActive(true);
			Transform transform = ((Component)currentWheel).transform;
			transform.SetAsLastSibling();
			transform.localPosition = Vector3.zero;
			currentWheel.ResetState();
			currentWheel.Focused = true;
			currentWheel.AddOnEmoteSelectedCallback(UpdateSelectedEmote);
			EmoteWheelData emoteWheelData = WheelSetData.EmoteWheels[_currentWheelIndex];
			((TMP_Text)wheelLabel).SetText(emoteWheelData.Name, true);
		}

		private void UpdateSelectedEmote(string selectedEmote)
		{
			_selectedEmote = selectedEmote;
		}

		private void FadeWheelLeft(int wheelIndex, bool instant = false)
		{
			FadeWheel(wheelIndex, left: true, instant);
		}

		private void FadeWheelRight(int wheelIndex, bool instant = false)
		{
			FadeWheel(wheelIndex, left: false, instant);
		}

		private void FadeWheel(int wheelIndex, bool left, bool instant = false)
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			if (fadeCurve != null)
			{
				EmoteWheel emoteWheel = _wheels[wheelIndex];
				Vector3 targetPos = default(Vector3);
				((Vector3)(ref targetPos))..ctor(left ? (0f - fadeDist) : fadeDist, 0f, 0f);
				emoteWheel.TweenPos(targetPos, fadeCurve, instant ? 0f : fadeDuration, ignoreTimeScale: true);
				emoteWheel.TweenAlpha(0f, fadeCurve, instant ? 0f : fadeDuration, ignoreTimeScale: true);
				emoteWheel.DisableAfterDuration(instant ? 0f : fadeDuration, ignoreTimeScale: true);
			}
		}
	}
	[DisallowMultipleComponent]
	[RequireComponent(typeof(RectTransform))]
	[ExecuteAlways]
	public class EmoteWheelSegment : UIBehaviour, IPointerEnterHandler, IEventSystemHandler, IPointerExitHandler
	{
		public WheelSegmentGraphic? targetGraphic;

		public SegmentLabel? targetLabel;

		public RectTransform? segmentRectTransform;

		public ColorBlock colors;

		[Range(1f, 2f)]
		public float scaleMultiplier;

		public bool selected;

		public bool focused;

		private bool IsSelected()
		{
			return selected && focused;
		}

		protected override void Awake()
		{
			((UIBehaviour)this).Awake();
			if (targetGraphic == null)
			{
				targetGraphic = ((Component)this).GetComponentInChildren<WheelSegmentGraphic>();
			}
			if (targetLabel == null)
			{
				targetLabel = ((Component)this).GetComponentInChildren<SegmentLabel>();
			}
		}

		protected override void OnEnable()
		{
			((UIBehaviour)this).OnEnable();
			UpdateState(requireFocus: false, instant: true);
		}

		public void OnPointerEnter(PointerEventData eventData)
		{
			selected = true;
			UpdateState();
		}

		public void OnPointerExit(PointerEventData eventData)
		{
			selected = false;
			UpdateState();
		}

		public void DeSelect()
		{
			selected = false;
			UpdateState(requireFocus: false);
		}

		public void ResetState()
		{
			selected = false;
			UpdateState(requireFocus: false, instant: true);
		}

		private Color GetColor()
		{
			//IL_001f: 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_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			if (IsSelected())
			{
				return ((ColorBlock)(ref colors)).selectedColor;
			}
			return ((ColorBlock)(ref colors)).normalColor;
		}

		private float GetScale()
		{
			if (IsSelected())
			{
				return scaleMultiplier;
			}
			return 1f;
		}

		private void UpdateState(bool requireFocus = true, bool instant = false)
		{
			//IL_0013: 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_001a: 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 (!(!focused && requireFocus))
			{
				Color color = GetColor();
				StartColorTween(color * ((ColorBlock)(ref colors)).colorMultiplier, instant);
				StartScaleTween(GetScale(), instant);
			}
		}

		private void StartColorTween(Color targetColor, bool instant)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			if (targetGraphic != null)
			{
				((Graphic)targetGraphic).CrossFadeColor(targetColor, instant ? 0f : ((ColorBlock)(ref colors)).fadeDuration, true, true);
			}
		}

		private void StartScaleTween(float targetScale, bool instant)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			if (targetGraphic != null && targetLabel != null)
			{
				targetGraphic.TweenScale(new Vector3(targetScale, targetScale, targetScale), instant ? 0f : ((ColorBlock)(ref colors)).fadeDuration, ignoreTimeScale: true);
				targetLabel.TweenScale(new Vector3(targetScale, targetScale, targetScale), instant ? 0f : ((ColorBlock)(ref colors)).fadeDuration, ignoreTimeScale: true);
			}
		}
	}
	[DisallowMultipleComponent]
	[RequireComponent(typeof(RectTransform))]
	[ExecuteAlways]
	public class SegmentLabel : UIBehaviour
	{
		private readonly TweenRunner<Vector3Tween> _scaleTweenRunner = new TweenRunner<Vector3Tween>();

		public RectTransform? targetLabel;

		public TextMeshProUGUI? targetText;

		private RectTransform? _rectTransform;

		private string? _emoteKey;

		protected DrivenRectTransformTracker Tracker;

		public RectTransform RectTransform
		{
			get
			{
				if (_rectTransform == null)
				{
					_rectTransform = ((Component)this).GetComponent<RectTransform>();
				}
				return _rectTransform;
			}
		}

		protected SegmentLabel()
		{
			_scaleTweenRunner.Init((MonoBehaviour)(object)this);
		}

		protected override void OnEnable()
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: 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)
			((UIBehaviour)this).OnEnable();
			if (targetLabel != null)
			{
				((DrivenRectTransformTracker)(ref Tracker)).Add((Object)(object)this, targetLabel, (DrivenTransformProperties)16);
				Vector3 eulerAngles = ((Transform)RectTransform).eulerAngles;
				((Transform)targetLabel).localEulerAngles = -eulerAngles;
				UpdateText();
			}
		}

		protected override void OnDisable()
		{
			((UIBehaviour)this).OnDisable();
			((DrivenRectTransformTracker)(ref Tracker)).Clear();
		}

		public void SetEmote(string? emoteKey)
		{
			_emoteKey = emoteKey;
			UpdateText();
		}

		private void UpdateText()
		{
			if (targetText != null && _emoteKey != null)
			{
				((TMP_Text)targetText).SetText(EmoteUiManager.GetEmoteName(_emoteKey), true);
			}
		}

		public void TweenScale(Vector3 targetScale, float duration, bool ignoreTimeScale)
		{
			//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_003e: 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)
			if (((Component)this).transform.localScale == targetScale)
			{
				_scaleTweenRunner.StopTween();
				return;
			}
			Vector3Tween vector3Tween = default(Vector3Tween);
			vector3Tween.Duration = duration;
			vector3Tween.StartValue = ((Component)this).transform.localScale;
			vector3Tween.TargetValue = targetScale;
			vector3Tween.IgnoreTimeScale = ignoreTimeScale;
			Vector3Tween tweenValue = vector3Tween;
			tweenValue.AddOnChangedCallback(TweenScaleChanged);
			_scaleTweenRunner.StartTween(tweenValue);
		}

		private void TweenScaleChanged(Vector3 scale)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			((Component)this).transform.localScale = scale;
		}
	}
	[DisallowMultipleComponent]
	[RequireComponent(typeof(CanvasRenderer))]
	[ExecuteAlways]
	public class WheelSegmentGraphic : Graphic
	{
		private readonly TweenRunner<Vector3Tween> _scaleTweenRunner = new TweenRunner<Vector3Tween>();

		public int segmentCount = 8;

		public float segmentRotOffset = 22.5f;

		public float minRadius = 100f;

		public float maxRadius = 300f;

		protected WheelSegmentGraphic()
		{
			_scaleTweenRunner.Init((MonoBehaviour)(object)this);
		}

		protected override void OnEnable()
		{
			((Graphic)this).OnEnable();
			((Graphic)this).raycastTarget = false;
		}

		protected override void OnPopulateMesh(VertexHelper vh)
		{
			//IL_0009: 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)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: 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_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_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: 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_00b9: 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_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: 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_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_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_0124: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: 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_013d: 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_0147: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: 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_0162: 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)
			vh.Clear();
			Color32 val = Color32.op_Implicit(((Graphic)this).color);
			float num = (float)(Math.PI * 2.0 / (double)segmentCount);
			float num2 = num + MathF.PI / 180f * segmentRotOffset;
			int num3 = 0;
			float num4 = MathF.PI / 180f;
			Vector3 val2 = CosSin(num2, minRadius);
			Vector3 val3 = CosSin(num2 + num, minRadius);
			Vector3 val4 = -Vector3.Lerp(val2, val3, 0.5f);
			float num5 = num + num4 / 2f - num4;
			for (float num6 = 0f; num6 < num5; num6 += num4)
			{
				float rad = num2 + num6;
				Vector3 val5 = CosSin(rad, minRadius) + val4;
				Vector3 val6 = CosSin(rad, maxRadius) + val4;
				rad = num2 + num6 + num4;
				Vector3 val7 = CosSin(rad, minRadius) + val4;
				Vector3 val8 = CosSin(rad, maxRadius) + val4;
				float num7 = num6 / num5;
				float num8 = (num6 + num4) / num5;
				vh.AddVert(val5, val, Vector4.op_Implicit(new Vector2(num7, 0f)));
				vh.AddVert(val6, val, Vector4.op_Implicit(new Vector2(num7, 1f)));
				vh.AddVert(val7, val, Vector4.op_Implicit(new Vector2(num8, 0f)));
				vh.AddVert(val8, val, Vector4.op_Implicit(new Vector2(num8, 1f)));
				vh.AddTriangle(num3 + 2, num3 + 1, num3);
				vh.AddTriangle(num3 + 3, num3 + 1, num3 + 2);
				num3 += 4;
			}
		}

		private static Vector3 CosSin(float rad, float dist)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			float num = (float)(Math.Cos(rad) * (double)dist);
			float num2 = (float)(Math.Sin(rad) * (double)dist);
			return new Vector3(num, num2, 0f);
		}

		public void TweenScale(Vector3 targetScale, float duration, bool ignoreTimeScale)
		{
			//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_003e: 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)
			if (((Component)this).transform.localScale == targetScale)
			{
				_scaleTweenRunner.StopTween();
				return;
			}
			Vector3Tween vector3Tween = default(Vector3Tween);
			vector3Tween.Duration = duration;
			vector3Tween.StartValue = ((Component)this).transform.localScale;
			vector3Tween.TargetValue = targetScale;
			vector3Tween.IgnoreTimeScale = ignoreTimeScale;
			Vector3Tween tweenValue = vector3Tween;
			tweenValue.AddOnChangedCallback(TweenScaleChanged);
			_scaleTweenRunner.StartTween(tweenValue);
		}

		private void TweenScaleChanged(Vector3 scale)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			((Component)this).transform.localScale = scale;
		}
	}
	[DisallowMultipleComponent]
	[RequireComponent(typeof(RectTransform))]
	[ExecuteAlways]
	public class WheelStopEmote : UIBehaviour, IPointerEnterHandler, IEventSystemHandler, IPointerExitHandler
	{
		public WheelStopEmoteGraphic? backgroundGraphic;

		public Graphic? foregroundGraphic;

		public LeUiScaleTweener? scaleTweener;

		public ColorBlock colors;

		[Range(1f, 2f)]
		public float scaleMultiplier;

		public bool selected;

		protected override void OnEnable()
		{
			((UIBehaviour)this).OnEnable();
			UpdateState(instant: true);
		}

		public void OnPointerEnter(PointerEventData eventData)
		{
			selected = true;
			UpdateState();
		}

		public void OnPointerExit(PointerEventData eventData)
		{
			selected = false;
			UpdateState();
		}

		private Color GetBackgroundColor()
		{
			//IL_001f: 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_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			if (selected)
			{
				return ((ColorBlock)(ref colors)).selectedColor;
			}
			return ((ColorBlock)(ref colors)).normalColor;
		}

		private Color GetForegroundColor()
		{
			//IL_001f: 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_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			if (selected)
			{
				return ((ColorBlock)(ref colors)).highlightedColor;
			}
			return ((ColorBlock)(ref colors)).disabledColor;
		}

		private float GetScale()
		{
			if (selected)
			{
				return scaleMultiplier;
			}
			return 1f;
		}

		private void UpdateState(bool instant = false)
		{
			//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_0009: 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)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			Color backgroundColor = GetBackgroundColor();
			Color foregroundColor = GetForegroundColor();
			StartColorTween(foregroundColor * ((ColorBlock)(ref colors)).colorMultiplier, backgroundColor * ((ColorBlock)(ref colors)).colorMultiplier, instant);
			float scale = GetScale();
			StartScaleTween(scale, instant);
		}

		private void StartColorTween(Color foregroundColor, Color backgroundColor, bool instant)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			((Graphic)backgroundGraphic).CrossFadeColor(backgroundColor, instant ? 0f : ((ColorBlock)(ref colors)).fadeDuration, true, true);
			foregroundGraphic.CrossFadeColor(foregroundColor, instant ? 0f : ((ColorBlock)(ref colors)).fadeDuration, true, true);
		}

		private void StartScaleTween(float scale, bool instant)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			if (scaleTweener != null)
			{
				Vector3 targetScale = default(Vector3);
				((Vector3)(ref targetScale))..ctor(scale, scale, scale);
				scaleTweener.TweenScale(targetScale, instant ? 0f : ((ColorBlock)(ref colors)).fadeDuration, ignoreTimeScale: true);
			}
		}
	}
	[DisallowMultipleComponent]
	[RequireComponent(typeof(CanvasRenderer))]
	[ExecuteAlways]
	public class WheelStopEmoteGraphic : Graphic
	{
		public float radius = 95f;

		protected override void OnPopulateMesh(VertexHelper vh)
		{
			//IL_0009: 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)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: 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_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: 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_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: 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)
			vh.Clear();
			Color32 val = Color32.op_Implicit(((Graphic)this).color);
			float num = MathF.PI * 2f;
			int num2 = 0;
			float num3 = MathF.PI / 180f;
			for (float num4 = 0f; num4 + num3 < num; num4 += num3)
			{
				float rad = num4;
				Vector3 val2 = CosSin(rad, radius);
				rad = num4 + num3;
				Vector3 val3 = CosSin(rad, radius);
				vh.AddVert(Vector3.zero, val, Vector4.op_Implicit(new Vector2(0f, 0f)));
				vh.AddVert(val2, val, Vector4.op_Implicit(new Vector2(0f, 1f)));
				vh.AddVert(Vector3.zero, val, Vector4.op_Implicit(new Vector2(1f, 0f)));
				vh.AddVert(val3, val, Vector4.op_Implicit(new Vector2(1f, 1f)));
				vh.AddTriangle(num2 + 2, num2 + 1, num2);
				vh.AddTriangle(num2 + 3, num2 + 1, num2 + 2);
				num2 += 4;
			}
		}

		private static Vector3 CosSin(float rad, float dist)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			float num = (float)(Math.Cos(rad) * (double)dist);
			float num2 = (float)(Math.Sin(rad) * (double)dist);
			return new Vector3(num, num2, 0f);
		}
	}
}
namespace LethalEmotesApi.Ui.Options
{
	public class DmcaFreeDropdown : LeUiDropdown
	{
		protected override int GetCurrentValue()
		{
			return EmoteUiManager.DmcaFree;
		}

		protected override void SetCurrentValue(int value)
		{
			EmoteUiManager.DmcaFree = value;
		}
	}
	public class EmotesAlertEnemies : LeUiToggle
	{
		protected override bool GetCurrentValue()
		{
			return EmoteUiManager.EmotesAlertEnemies;
		}

		protected override void SetCurrentValue(bool value)
		{
			EmoteUiManager.EmotesAlertEnemies = value;
		}
	}
	public class EmoteVolumeSlider : MonoBehaviour
	{
		public Slider? volumeSlider;

		private bool _hasListener;

		private void Awake()
		{
			UpdateSliderValue();
			EnsureListener();
		}

		private void Start()
		{
			UpdateSliderValue();
			EnsureListener();
		}

		private void OnEnable()
		{
			UpdateSliderValue();
			EnsureListener();
		}

		private void UpdateSliderValue()
		{
			if (volumeSlider != null)
			{
				volumeSlider.value = EmoteUiManager.EmoteVolume;
			}
		}

		private void EnsureListener()
		{
			if (volumeSlider != null && !_hasListener)
			{
				((UnityEvent<float>)(object)volumeSlider.onValueChanged).AddListener((UnityAction<float>)SliderChanged);
				_hasListener = true;
			}
		}

		private void SliderChanged(float value)
		{
			EmoteUiManager.EmoteVolume = value;
			SetValueWithoutNotify(value);
		}

		private void SetValueWithoutNotify(float value)
		{
			if (volumeSlider != null)
			{
				volumeSlider.SetValueWithoutNotify(value);
			}
		}
	}
	public class HideJoinSpots : LeUiToggle
	{
		protected override bool GetCurrentValue()
		{
			return EmoteUiManager.HideJoinSpots;
		}

		protected override void SetCurrentValue(bool value)
		{
			EmoteUiManager.HideJoinSpots = value;
		}
	}
	public abstract class LeUiDropdown : MonoBehaviour
	{
		public TMP_Dropdown? dropdown;

		private bool _hasListener;

		private void Awake()
		{
			UpdateDropdown();
			EnsureListener();
		}

		private void Start()
		{
			UpdateDropdown();
			EnsureListener();
		}

		private void OnEnable()
		{
			UpdateDropdown();
			EnsureListener();
		}

		private void UpdateDropdown()
		{
			if (dropdown != null)
			{
				dropdown.value = GetCurrentValue();
			}
		}

		private void EnsureListener()
		{
			if (dropdown != null && !_hasListener)
			{
				((UnityEvent<int>)(object)dropdown.onValueChanged).AddListener((UnityAction<int>)DropdownChanged);
				_hasListener = true;
			}
		}

		private void DropdownChanged(int value)
		{
			SetCurrentValue(value);
			SetValueWithoutNotify(value);
		}

		protected abstract int GetCurrentValue();

		protected abstract void SetCurrentValue(int value);

		private void SetValueWithoutNotify(int value)
		{
			if (dropdown != null)
			{
				dropdown.SetValueWithoutNotify(value);
			}
		}
	}
	public abstract class LeUiToggle : MonoBehaviour
	{
		public Image? checkboxImage;

		private void Awake()
		{
			UpdateCheckbox();
		}

		private void Start()
		{
			UpdateCheckbox();
		}

		private void OnEnable()
		{
			UpdateCheckbox();
		}

		public void Toggle()
		{
			SetCurrentValue(!GetCurrentValue());
			UpdateCheckbox();
		}

		private void UpdateCheckbox()
		{
			if (checkboxImage != null)
			{
				((Behaviour)checkboxImage).enabled = GetCurrentValue();
			}
		}

		protected abstract bool GetCurrentValue();

		protected abstract void SetCurrentValue(bool value);
	}
	public class RootMotionTypeDropdown : LeUiDropdown
	{
		protected override int GetCurrentValue()
		{
			return EmoteUiManager.RootMotionType;
		}

		protected override void SetCurrentValue(int value)
		{
			EmoteUiManager.RootMotionType = value;
		}
	}
	public class ThirdPersonDropdown : LeUiDropdown
	{
		protected override int GetCurrentValue()
		{
			return EmoteUiManager.ThirdPerson;
		}

		protected override void SetCurrentValue(int value)
		{
			EmoteUiManager.ThirdPerson = value;
		}
	}
}
namespace LethalEmotesApi.Ui.Elements
{
	[DisallowMultipleComponent]
	public class LeUiButton : UIBehaviour, IPointerEnterHandler, IEventSystemHandler, IPointerExitHandler, IPointerDownHandler, IPointerUpHandler, IPointerClickHandler
	{
		public Graphic? targetGraphic;

		public LeUiScaleTweener? scaleTweener;

		public ColorBlock colors;

		[Range(0f, 2f)]
		public float scaleSelected;

		[Range(0f, 2f)]
		public float scalePressed;

		public UnityEvent onClick = new UnityEvent();

		public UnityEvent onEnter = new UnityEvent();

		public UnityEvent onExit = new UnityEvent();

		private bool _selected;

		private bool _pressed;

		protected override void OnEnable()
		{
			((UIBehaviour)this).OnEnable();
			UpdateState(instant: true);
		}

		public void OnPointerEnter(PointerEventData eventData)
		{
			_selected = true;
			onEnter.Invoke();
			UpdateState();
		}

		public void OnPointerExit(PointerEventData eventData)
		{
			_selected = false;
			onExit.Invoke();
			UpdateState();
		}

		public void OnPointerDown(PointerEventData eventData)
		{
			_pressed = _selected;
			UpdateState();
		}

		public void OnPointerUp(PointerEventData eventData)
		{
			_pressed = false;
			UpdateState();
		}

		public void OnPointerClick(PointerEventData eventData)
		{
			onClick.Invoke();
		}

		private Color GetColor()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_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)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			if (_pressed)
			{
				return ((ColorBlock)(ref colors)).pressedColor;
			}
			if (_selected)
			{
				return ((ColorBlock)(ref colors)).selectedColor;
			}
			return ((ColorBlock)(ref colors)).normalColor;
		}

		private float GetScale()
		{
			if (_pressed)
			{
				return scalePressed;
			}
			if (_selected)
			{
				return scaleSelected;
			}
			return 1f;
		}

		private void UpdateState(bool instant = false)
		{
			//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_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			Color color = GetColor();
			targetGraphic.CrossFadeColor(color, instant ? 0f : ((ColorBlock)(ref colors)).fadeDuration, true, true);
			float scale = GetScale();
			Vector3 targetScale = default(Vector3);
			((Vector3)(ref targetScale))..ctor(scale, scale, scale);
			scaleTweener.TweenScale(targetScale, instant ? 0f : ((ColorBlock)(ref colors)).fadeDuration, ignoreTimeScale: true);
		}
	}
	[DisallowMultipleComponent]
	[ExecuteAlways]
	public class LeUiScaleTweener : MonoBehaviour
	{
		private readonly TweenRunner<Vector3Tween> _scaleTweenRunner = new TweenRunner<Vector3Tween>();

		private Vector3 _internalScale = Vector3.one;

		public List<RectTransform> targets = new List<RectTransform>();

		protected LeUiScaleTweener()
		{
			//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)
			_scaleTweenRunner.Init((MonoBehaviour)(object)this);
		}

		public void TweenScale(Vector3 targetScale, float duration, bool ignoreTimeScale)
		{
			//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_003d: 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)
			if (_internalScale == targetScale)
			{
				_scaleTweenRunner.StopTween();
				return;
			}
			Vector3Tween vector3Tween = default(Vector3Tween);
			vector3Tween.Duration = duration;
			vector3Tween.IgnoreTimeScale = ignoreTimeScale;
			vector3Tween.StartValue = _internalScale;
			vector3Tween.TargetValue = targetScale;
			Vector3Tween tweenValue = vector3Tween;
			tweenValue.AddOnChangedCallback(TweenScaleChanged);
			_scaleTweenRunner.StartTween(tweenValue);
		}

		private void TweenScaleChanged(Vector3 scale)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			_internalScale = scale;
			foreach (RectTransform target in targets)
			{
				((Transform)target).localScale = scale;
			}
		}
	}
	public class LeUiSelectOutline : UIBehaviour, IPointerEnterHandler, IEventSystemHandler, IPointerExitHandler
	{
		public Image? selectImage;

		public void OnPointerEnter(PointerEventData eventData)
		{
			if (selectImage != null)
			{
				((Behaviour)selectImage).enabled = true;
			}
		}

		public void OnPointerExit(PointerEventData eventData)
		{
			if (selectImage != null)
			{
				((Behaviour)selectImage).enabled = false;
			}
		}
	}
}
namespace LethalEmotesApi.Ui.Db
{
	public interface IEmoteDb
	{
		IReadOnlyCollection<string> EmoteKeys { get; }

		IReadOnlyCollection<string> EmoteModNames { get; }

		string GetEmoteName(string emoteKey);

		void AssociateEmoteKeyWithMod(string emoteKey, string modName);

		string GetModName(string emoteKey);
	}
}
namespace LethalEmotesApi.Ui.Data
{
	[Serializable]
	public class EmoteWheelData
	{
		public string Name { get; set; }

		public bool? IsDefault { get; set; }

		public string[] Emotes { get; set; }

		public EmoteWheelData(string name)
		{
			Name = name;
			IsDefault = false;
			Emotes = new string[8];
			base..ctor();
		}

		public bool IsDefaultWheel()
		{
			return IsDefault.HasValue && IsDefault.Value;
		}

		public static EmoteWheelData CreateDefault(int wheelIndex = 0)
		{
			EmoteWheelData emoteWheelData = new EmoteWheelData($"Wheel {wheelIndex + 1}");
			Array.Fill(emoteWheelData.Emotes, "none");
			return emoteWheelData;
		}
	}
	[Serializable]
	public class EmoteWheelSetData
	{
		public EmoteWheelData[] EmoteWheels { get; set; } = Array.Empty<EmoteWheelData>();


		public int IndexOfDefault()
		{
			int result = -1;
			for (int i = 0; i < EmoteWheels.Length; i++)
			{
				if (EmoteWheels[i].IsDefaultWheel())
				{
					result = i;
					break;
				}
			}
			return result;
		}

		public static EmoteWheelSetData Default()
		{
			EmoteWheelSetData emoteWheelSetData = new EmoteWheelSetData();
			emoteWheelSetData.EmoteWheels = new EmoteWheelData[1] { EmoteWheelData.CreateDefault() };
			return emoteWheelSetData;
		}
	}
	public interface IEmoteUiStateController
	{
		IEmoteDb EmoteDb { get; }

		IReadOnlyCollection<string> RandomPoolBlacklist { get; }

		float EmoteVolume { get; set; }

		bool HideJoinSpots { get; set; }

		int RootMotionType { get; set; }

		bool EmotesAlertEnemies { get; set; }

		int DmcaFree { get; set; }

		int ThirdPerson { get; set; }

		void PlayEmote(string emoteKey);

		void LockMouseInput();

		void UnlockMouseInput();

		void LockPlayerInput();

		void UnlockPlayerInput();

		bool CanOpenEmoteUi();

		void PlayAnimationOn(Animator animator, string emoteKey);

		void AddToRandomPoolBlacklist(string emoteKey);

		void RemoveFromRandomPoolBlacklist(string emoteKey);

		EmoteWheelSetData LoadEmoteWheelSetData();

		void SaveEmoteWheelSetData(EmoteWheelSetData dataToSave);
	}
	public class SearchableEmoteArray : IReadOnlyList<string>, IEnumerable<string>, IEnumerable, IReadOnlyCollection<string>
	{
		public enum SortOrder
		{
			Descending,
			Ascending
		}

		private readonly struct CacheState : IEquatable<CacheState>
		{
			public readonly SortOrder Order;

			public readonly string Filter;

			public CacheState(SortOrder order, string filter)
			{
				Order = order;
				Filter = filter;
			}

			public bool Equals(CacheState other)
			{
				return Order == other.Order && Filter == other.Filter;
			}

			public override bool Equals(object? obj)
			{
				return obj is CacheState other && Equals(other);
			}

			public override int GetHashCode()
			{
				return HashCode.Combine((int)Order, Filter);
			}

			public static bool operator ==(CacheState left, CacheState right)
			{
				return left.Equals(right);
			}

			public static bool operator !=(CacheState left, CacheState right)
			{
				return !(left == right);
			}
		}

		private readonly string[] _emoteKeys;

		private CacheState _state;

		private int[] _lut = null;

		private string[] _cachedKeys = Array.Empty<string>();

		public int Count => _cachedKeys.Length;

		public string this[int index] => _cachedKeys[index];

		public SortOrder Order
		{
			get
			{
				return _state.Order;
			}
			set
			{
				CacheState state = _state;
				_state = new CacheState(value, _state.Filter);
				if (_state != state)
				{
					UpdateCachedKeys();
				}
			}
		}

		public string Filter
		{
			get
			{
				return _state.Filter;
			}
			set
			{
				CacheState state = _state;
				_state = new CacheState(_state.Order, value);
				if (_state != state)
				{
					UpdateCachedKeys();
				}
			}
		}

		public SearchableEmoteArray(string[] emoteKeys)
		{
			_emoteKeys = emoteKeys;
			_state = new CacheState(SortOrder.Descending, "");
			UpdateCachedKeys();
		}

		private int[] CreateLut(IEnumerable<string> emoteKeys)
		{
			return (from kvp in emoteKeys.Select((string key, int index) => new KeyValuePair<string, int>(key, index))
				orderby EmoteUiManager.GetEmoteName(kvp.Key)
				where MatchesFilter(kvp.Key, Filter)
				select kvp.Value).ToArray();
		}

		private void UpdateCachedKeys()
		{
			_lut = CreateLut(_emoteKeys);
			_cachedKeys = new string[_lut.Length];
			for (int i = 0; i < _lut.Length; i++)
			{
				_cachedKeys[i] = _emoteKeys[_lut[i]];
			}
		}

		public IEnumerator<string> GetEnumerator()
		{
			return ((IEnumerable<string>)_cachedKeys).GetEnumerator();
		}

		IEnumerator IEnumerable.GetEnumerator()
		{
			return GetEnumerator();
		}

		private static bool MatchesFilter(string emoteKey, string filter)
		{
			if (string.IsNullOrEmpty(filter))
			{
				return true;
			}
			if (filter.StartsWith('@'))
			{
				string emoteModName = EmoteUiManager.GetEmoteModName(emoteKey);
				string value = filter.Substring(1, filter.Length - 1);
				return emoteModName.Contains(value, StringComparison.InvariantCultureIgnoreCase);
			}
			string emoteName = EmoteUiManager.GetEmoteName(emoteKey);
			return emoteKey.Contains(filter, StringComparison.InvariantCultureIgnoreCase) || emoteName.Contains(filter, StringComparison.InvariantCultureIgnoreCase);
		}
	}
}
namespace LethalEmotesApi.Ui.Customize
{
	[DisallowMultipleComponent]
	[RequireComponent(typeof(EmoteDragDropController))]
	public class CustomizePanel : MonoBehaviour
	{
		public EmoteDragDropController? dragDropController;

		public PreviewController? previewController;

		private void Awake()
		{
			if (dragDropController == null)
			{
				dragDropController = ((Component)this).GetComponent<EmoteDragDropController>();
			}
			if (previewController == null)
			{
				previewController = ((Component)this).GetComponentInChildren<PreviewController>();
			}
		}
	}
	public class DeleteWheelPopup : UIBehaviour
	{
		public CustomizeWheelController? customizeWheelController;

		public void Cancel()
		{
			Object.Destroy((Object)(object)((Component)this).gameObject);
		}

		public void Confirm()
		{
			if (customizeWheelController == null)
			{
				Cancel();
			}
			else
			{
				customizeWheelController.DeleteWheel();
			}
		}
	}
}
namespace LethalEmotesApi.Ui.Customize.Wheel
{
	[DisallowMultipleComponent]
	[RequireComponent(typeof(RectTransform))]
	public class CustomizeWheel : UIBehaviour, IBeginDragHandler, IEventSystemHandler, IDragHandler, IPointerEnterHandler, IPointerMoveHandler
	{
		public class EmoteChangedCallback : UnityEvent<int, string>
		{
		}

		public class EmotesSwappedCallback : UnityEvent<int, int>
		{
		}

		public PreviewController? previewController;

		public EmoteDragDropController? dragDropController;

		public ColorBlock colors;

		[Range(1f, 2f)]
		public float scaleMultiplier;

		public Material? segmentMaterial;

		public WheelDefaultButton? defaultButton;

		public float minDist = 100f;

		public List<CustomizeWheelSegment> wheelSegments = new List<CustomizeWheelSegment>();

		public EmoteChangedCallback OnEmoteChanged = new EmoteChangedCallback();

		public EmotesSwappedCallback OnEmotesSwapped = new EmotesSwappedCallback();

		private string[] _emoteArray = Array.Empty<string>();

		private int _currentSegmentIndex = -1;

		private RectTransform? _rectTransform;

		public RectTransform RectTransform
		{
			get
			{
				if (_rectTransform == null)
				{
					_rectTransform = ((Component)this).GetComponent<RectTransform>();
				}
				return _rectTransform;
			}
		}

		protected override void Awake()
		{
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			((UIBehaviour)this).Awake();
			if (dragDropController == null)
			{
				dragDropController = ((Component)this).GetComponentInParent<EmoteDragDropController>();
			}
			if (previewController == null)
			{
				previewController = ((Component)this).GetComponentInParent<CustomizePanel>().previewController;
			}
			foreach (CustomizeWheelSegment wheelSegment in wheelSegments)
			{
				wheelSegment.colors = colors;
				wheelSegment.scaleMultiplier = scaleMultiplier;
				if (segmentMaterial != null)
				{
					((Graphic)wheelSegment.targetGraphic).material = segmentMaterial;
				}
				wheelSegment.ResetState();
			}
		}

		protected override void Start()
		{
			((UIBehaviour)this).Start();
			ResetState();
		}

		protected override void OnEnable()
		{
			((UIBehaviour)this).OnEnable();
			ResetState();
		}

		public void OnBeginDrag(PointerEventData eventData)
		{
			StartDrag(eventData);
		}

		public void OnDrag(PointerEventData eventData)
		{
			StartDrag(eventData);
		}

		public void OnPointerEnter(PointerEventData eventData)
		{
			OnPointerMove(eventData);
		}

		public void OnPointerMove(PointerEventData eventData)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			if (dragDropController == null)
			{
				return;
			}
			Vector2 mousePos = default(Vector2);
			RectTransformUtility.ScreenPointToLocalPointInRectangle(RectTransform, eventData.position, eventData.enterEventCamera, ref mousePos);
			int currentSegmentIndex = _currentSegmentIndex;
			DetectSegmentFromMouse(mousePos);
			if (_currentSegmentIndex < 0)
			{
				dragDropController.OnNotGrab();
				return;
			}
			dragDropController.OnCanGrab();
			if (dragDropController.DragState == EmoteDragDropController.DragDropState.Ready && previewController != null && currentSegmentIndex != _currentSegmentIndex)
			{
				previewController.PlayEmote(_emoteArray[_currentSegmentIndex]);
			}
		}

		private void StartDrag(PointerEventData eventData)
		{
			if (dragDropController != null)
			{
				if (_currentSegmentIndex < 0)
				{
					dragDropController.OnNotGrab();
					return;
				}
				dragDropController.StartWheelGrab(_currentSegmentIndex, _emoteArray[_currentSegmentIndex], eventData);
				GameObject val = (eventData.pointerDrag = ((Component)dragDropController).gameObject);
				ExecuteEvents.Execute<IDragHandler>(val, (BaseEventData)(object)eventData, ExecuteEvents.dragHandler);
			}
		}

		public void LoadEmoteData(EmoteWheelData emoteData)
		{
			if (defaultButton != null)
			{
				defaultButton.SetDefault(emoteData.IsDefaultWheel());
				_emoteArray = emoteData.Emotes;
				ResetState();
			}
		}

		public void DetectSegmentFromMouse(Vector2 mousePos)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: 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_0060: Unknown result type (might be due to invalid IL or missing references)
			float num = Vector2.Distance(Vector2.zero, mousePos);
			if (num < minDist)
			{
				DeSelectAll();
				return;
			}
			Rect rect = RectTransform.rect;
			if (mousePos.x > ((Rect)(ref rect)).xMax || mousePos.x < ((Rect)(ref rect)).xMin || mousePos.y > ((Rect)(ref rect)).yMax || mousePos.y < ((Rect)(ref rect)).yMin)
			{
				DeSelectAll();
				return;
			}
			int closestSegmentIndex = GetClosestSegmentIndex(mousePos);
			if (closestSegmentIndex != _currentSegmentIndex && _currentSegmentIndex >= 0)
			{
				wheelSegments[_currentSegmentIndex].DeSelect();
			}
			_currentSegmentIndex = closestSegmentIndex;
			SelectSegment();
		}

		public void DropEmote(string emoteKey)
		{
			if (_currentSegmentIndex >= 0)
			{
				wheelSegments[_currentSegmentIndex].DeSelect();
				((UnityEvent<int, string>)(object)OnEmoteChanged).Invoke(_currentSegmentIndex, emoteKey);
			}
		}

		public void SwapSegmentEmotes(int fromIndex)
		{
			if (fromIndex >= 0)
			{
				if (_currentSegmentIndex < 0)
				{
					((UnityEvent<int, string>)(object)OnEmoteChanged).Invoke(fromIndex, "none");
					return;
				}
				ref string reference = ref _emoteArray[_currentSegmentIndex];
				ref string reference2 = ref _emoteArray[fromIndex];
				string text = _emoteArray[fromIndex];
				string text2 = _emoteArray[_currentSegmentIndex];
				reference = text;
				reference2 = text2;
				((UnityEvent<int, int>)OnEmotesSwapped).Invoke(fromIndex, _currentSegmentIndex);
			}
		}

		private void SelectSegment()
		{
			if (_currentSegmentIndex >= 0)
			{
				wheelSegments[_currentSegmentIndex].Select();
			}
		}

		public void DeSelectAll()
		{
			_currentSegmentIndex = -1;
			foreach (CustomizeWheelSegment wheelSegment in wheelSegments)
			{
				wheelSegment.DeSelect();
			}
		}

		public void ResetState()
		{
			_currentSegmentIndex = -1;
			foreach (CustomizeWheelSegment wheelSegment in wheelSegments)
			{
				wheelSegment.ResetState();
			}
			UpdateLabels();
		}

		private int GetClosestSegmentIndex(Vector2 mousePos)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: 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)
			int result = -1;
			float num = float.MaxValue;
			for (int i = 0; i < wheelSegments.Count; i++)
			{
				CustomizeWheelSegment customizeWheelSegment = wheelSegments[i];
				Vector2 val = Vector2.op_Implicit(((Transform)customizeWheelSegment.segmentRectTransform).position - ((Transform)RectTransform).position);
				float num2 = Vector2.Distance(val, mousePos);
				if (num2 < num)
				{
					num = num2;
					result = i;
				}
			}
			return result;
		}

		private void UpdateLabels()
		{
			if (_emoteArray.Length == wheelSegments.Count)
			{
				for (int i = 0; i < wheelSegments.Count; i++)
				{
					wheelSegments[i].SetLabel(_emoteArray[i]);
				}
			}
		}
	}
	public class CustomizeWheelController : UIBehaviour, IScrollHandler, IEventSystemHandler
	{
		public CustomizeWheel? customizeWheel;

		public TMP_InputField? wheelLabel;

		public GameObject? deleteConfirmationPrefab;

		private DeleteWheelPopup? _deleteWheelPopupInstance;

		private EmoteUiPanel? _emoteUiPanel;

		private int _wheelIndex = -1;

		private EmoteWheelSetData WheelSetData => EmoteUiManager.LoadEmoteWheelSetData();

		private int WheelCount => WheelSetData.EmoteWheels.Length;

		private bool HasWheels => WheelCount > 0;

		protected override void Awake()
		{
			((UIBehaviour)this).Awake();
			if (_emoteUiPanel == null)
			{
				_emoteUiPanel = ((Component)this).GetComponentInParent<EmoteUiPanel>();
			}
			if (customizeWheel != null && wheelLabel != null)
			{
				((UnityEvent<int, string>)(object)customizeWheel.OnEmoteChanged).AddListener((UnityAction<int, string>)EmoteAtIndexChanged);
				((UnityEvent<int, int>)customizeWheel.OnEmotesSwapped).AddListener((UnityAction<int, int>)EmotesSwapped);
				((UnityEvent<string>)(object)wheelLabel.onValueChanged).AddListener((UnityAction<string>)WheelLabelChanged);
				if (HasWheels)
				{
					_wheelIndex = 0;
					UpdateState();
				}
			}
		}

		protected override void OnDisable()
		{
			((UIBehaviour)this).OnDisable();
			if (_deleteWheelPopupInstance != null)
			{
				Object.DestroyImmediate((Object)(object)((Component)_deleteWheelPopupInstance).gameObject);
				_deleteWheelPopupInstance = null;
			}
		}

		public void NextWheel()
		{
			if (customizeWheel != null)
			{
				_wheelIndex++;
				if (_wheelIndex >= WheelCount)
				{
					_wheelIndex = 0;
				}
				UpdateState();
			}
		}

		public void PrevWheel()
		{
			if (customizeWheel != null)
			{
				_wheelIndex--;
				if (_wheelIndex < 0)
				{
					_wheelIndex = WheelCount - 1;
				}
				UpdateState();
			}
		}

		public void NewWheel()
		{
			if (customizeWheel != null)
			{
				int num = _wheelIndex + 1;
				EmoteWheelData[] emoteWheels = WheelSetData.EmoteWheels;
				EmoteWheelData emoteWheelData = EmoteWheelData.CreateDefault(emoteWheels.Length);
				IEnumerable<EmoteWheelData> enumerable = emoteWheels[..num].Concat(new <>z__ReadOnlyArray<EmoteWheelData>(new EmoteWheelData[1] { emoteWheelData }));
				if (num < emoteWheels.Length)
				{
					enumerable = enumerable.Concat(emoteWheels[num..]);
				}
				EmoteWheelSetData dataToSave = new EmoteWheelSetData
				{
					EmoteWheels = enumerable.ToArray()
				};
				EmoteUiManager.SaveEmoteWheelSetData(dataToSave);
				_wheelIndex = num;
				UpdateState();
			}
		}

		public void TryDelete()
		{
			if (deleteConfirmationPrefab != null)
			{
				GameObject val = Object.Instantiate<GameObject>(deleteConfirmationPrefab, ((Component)_emoteUiPanel).transform);
				_deleteWheelPopupInstance = val.GetComponent<DeleteWheelPopup>();
				_deleteWheelPopupInstance.customizeWheelController = this;
			}
		}

		public void DeleteWheel()
		{
			if (_deleteWheelPopupInstance == null)
			{
				return;
			}
			Object.DestroyImmediate((Object)(object)((Component)_deleteWheelPopupInstance).gameObject);
			_deleteWheelPopupInstance = null;
			if (customizeWheel == null || _wheelIndex < 0)
			{
				return;
			}
			EmoteWheelData[] emoteWheels = WheelSetData.EmoteWheels;
			if (emoteWheels.Length == 0)
			{
				return;
			}
			if (emoteWheels.Length == 1)
			{
				emoteWheels[0] = EmoteWheelData.CreateDefault();
				EmoteWheelSetData dataToSave = new EmoteWheelSetData
				{
					EmoteWheels = emoteWheels
				};
				EmoteUiManager.SaveEmoteWheelSetData(dataToSave);
				_wheelIndex = 0;
				UpdateState();
				return;
			}
			EmoteWheelData[] array = new EmoteWheelData[emoteWheels.Length - 1];
			int num = 0;
			int num2 = 0;
			do
			{
				if (num == _wheelIndex)
				{
					num2 = 1;
					num++;
				}
				else
				{
					array[num - num2] = emoteWheels[num];
					num++;
				}
			}
			while (num < emoteWheels.Length);
			EmoteWheelSetData dataToSave2 = new EmoteWheelSetData
			{
				EmoteWheels = array
			};
			EmoteUiManager.SaveEmoteWheelSetData(dataToSave2);
			PrevWheel();
		}

		public void ToggleDefault()
		{
			if (_wheelIndex < 0 || customizeWheel == null)
			{
				return;
			}
			EmoteWheelData[] emoteWheels = WheelSetData.EmoteWheels;
			int num = WheelSetData.IndexOfDefault();
			if (num < 0)
			{
				emoteWheels[_wheelIndex].IsDefault = true;
				EmoteWheelSetData dataToSave = new EmoteWheelSetData
				{
					EmoteWheels = emoteWheels
				};
				EmoteUiManager.SaveEmoteWheelSetData(dataToSave);
				UpdateState();
				return;
			}
			emoteWheels[num].IsDefault = false;
			if (num != _wheelIndex)
			{
				emoteWheels[_wheelIndex].IsDefault = true;
			}
			EmoteWheelSetData dataToSave2 = new EmoteWheelSetData
			{
				EmoteWheels = emoteWheels
			};
			EmoteUiManager.SaveEmoteWheelSetData(dataToSave2);
			UpdateState();
		}

		public void LoadWheelIndex(int wheelIndex)
		{
			if (customizeWheel != null)
			{
				EmoteWheelData emoteWheelData = WheelSetData.EmoteWheels[wheelIndex];
				customizeWheel.LoadEmoteData(emoteWheelData);
				if (wheelLabel != null)
				{
					wheelLabel.SetTextWithoutNotify(emoteWheelData.Name);
					_wheelIndex = wheelIndex;
				}
			}
		}

		private void WheelLabelChanged(string wheelName)
		{
			EmoteWheelSetData wheelSetData = WheelSetData;
			wheelSetData.EmoteWheels[_wheelIndex].Name = wheelName;
			EmoteUiManager.SaveEmoteWheelSetData(wheelSetData);
			UpdateState();
		}

		private void EmoteAtIndexChanged(int segmentIndex, string emoteKey)
		{
			EmoteWheelSetData wheelSetData = WheelSetData;
			wheelSetData.EmoteWheels[_wheelIndex].Emotes[segmentIndex] = emoteKey;
			EmoteUiManager.SaveEmoteWheelSetData(wheelSetData);
			UpdateState();
		}

		private void EmotesSwapped(int fromIndex, int toIndex)
		{
			EmoteWheelData[] emoteWheels = WheelSetData.EmoteWheels;
			string[] emotes = emoteWheels[_wheelIndex].Emotes;
			ref string reference = ref emotes[fromIndex];
			ref string reference2 = ref emotes[toIndex];
			string text = emotes[toIndex];
			string text2 = emotes[fromIndex];
			reference = text;
			reference2 = text2;
			emoteWheels[_wheelIndex].Emotes = emotes;
			EmoteWheelSetData dataToSave = new EmoteWheelSetData
			{
				EmoteWheels = emoteWheels
			};
			EmoteUiManager.SaveEmoteWheelSetData(dataToSave);
			UpdateState();
		}

		private void UpdateState()
		{
			LoadWheelIndex(_wheelIndex);
		}

		public void OnScroll(PointerEventData eventData)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			if (!((Behaviour)this).isActiveAndEnabled)
			{
				return;
			}
			float y = eventData.scrollDelta.y;
			float num = y;
			float num2 = num;
			if (!(num2 > 0f))
			{
				if (num2 < 0f)
				{
					NextWheel();
				}
			}
			else
			{
				PrevWheel();
			}
		}
	}
	[DisallowMultipleComponent]
	[RequireComponent(typeof(RectTransform))]
	public class CustomizeWheelSegment : UIBehaviour
	{
		public WheelSegmentGraphic? targetGraphic;

		public SegmentLabel? targetLabel;

		public RectTransform? segmentRectTransform;

		public ColorBlock colors;

		[Range(1f, 2f)]
		public float scaleMultiplier;

		public bool selected;

		protected override void Awake()
		{
			((UIBehaviour)this).Awake();
			if (targetGraphic == null)
			{
				targetGraphic = ((Component)this).GetComponentInChildren<WheelSegmentGraphic>();
			}
			if (targetLabel == null)
			{
				targetLabel = ((Component)this).GetComponentInChildren<SegmentLabel>();
			}
		}

		protected override void Start()
		{
			((UIBehaviour)this).Start();
			UpdateState(instant: true);
		}

		protected override void OnEnable()
		{
			((UIBehaviour)this).OnEnable();
			UpdateState(instant: true);
		}

		public void SetLabel(string text)
		{
			if (targetLabel != null)
			{
				targetLabel.SetEmote(text);
			}
		}

		public void Select()
		{
			selected = true;
			UpdateState();
		}

		public void DeSelect()
		{
			selected = false;
			UpdateState();
		}

		public void ResetState()
		{
			selected = false;
			UpdateState(instant: true);
		}

		private Color GetColor()
		{
			//IL_001f: 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_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			if (selected)
			{
				return ((ColorBlock)(ref colors)).selectedColor;
			}
			return ((ColorBlock)(ref colors)).normalColor;
		}

		private float GetScale()
		{
			if (selected)
			{
				return scaleMultiplier;
			}
			return 1f;
		}

		private void UpdateState(bool instant = false)
		{
			//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_0009: 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)
			Color color = GetColor();
			StartColorTween(color * ((ColorBlock)(ref colors)).colorMultiplier, instant);
			StartScaleTween(GetScale(), instant);
		}

		private void StartColorTween(Color targetColor, bool instant)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			if (targetGraphic != null)
			{
				((Graphic)targetGraphic).CrossFadeColor(targetColor, instant ? 0f : ((ColorBlock)(ref colors)).fadeDuration, true, true);
			}
		}

		private void StartScaleTween(float targetScale, bool instant)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			if (targetGraphic != null && targetLabel != null)
			{
				targetGraphic.TweenScale(new Vector3(targetScale, targetScale, targetScale), instant ? 0f : ((ColorBlock)(ref colors)).fadeDuration, ignoreTimeScale: true);
				targetLabel.TweenScale(new Vector3(targetScale, targetScale, targetScale), instant ? 0f : ((ColorBlock)(ref colors)).fadeDuration, ignoreTimeScale: true);
			}
		}
	}
	[DisallowMultipleComponent]
	[RequireComponent(typeof(RectTransform))]
	[ExecuteAlways]
	public class WheelDefaultButton : UIBehaviour, IPointerEnterHandler, IEventSystemHandler, IPointerExitHandler, IPointerClickHandler
	{
		public WheelStopEmoteGraphic? targetGraphic;

		public LeUiScaleTweener? scaleTweener;

		public TextMeshProUGUI? targetLabel;

		public ColorBlock colors;

		[Range(1f, 2f)]
		public float scaleMultiplier = 1f;

		public UnityEvent onClick = new UnityEvent();

		private bool _isDefault;

		public bool selected;

		protected override void OnEnable()
		{
			((UIBehaviour)this).OnEnable();
			UpdateState(instant: true);
		}

		public void OnPointerEnter(PointerEventData eventData)
		{
			selected = true;
			UpdateState();
		}

		public void OnPointerExit(PointerEventData eventData)
		{
			selected = false;
			UpdateState();
		}

		public void OnPointerClick(PointerEventData eventData)
		{
			onClick.Invoke();
		}

		public void SetDefault(bool isDefault, bool instant = false)
		{
			_isDefault = isDefault;
			UpdateState(instant);
		}

		private Color GetColor()
		{
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: 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_0051: Unknown result type (might be due to invalid IL or missing references)
			if (selected)
			{
				return _isDefault ? ((ColorBlock)(ref colors)).selectedColor : ((ColorBlock)(ref colors)).disabledColor;
			}
			return _isDefault ? ((ColorBlock)(ref colors)).highlightedColor : ((ColorBlock)(ref colors)).normalColor;
		}

		private float GetScale()
		{
			if (selected)
			{
				return scaleMultiplier;
			}
			return 1f;
		}

		private void UpdateLabel()
		{
			if (targetLabel != null)
			{
				((TMP_Text)targetLabel).text = (_isDefault ? "Unset as Default Wheel" : "Set as Default Wheel");
			}
		}

		private void UpdateState(bool instant = false)
		{
			//IL_0009: 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)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			UpdateLabel();
			Color color = GetColor();
			StartColorTween(color * ((ColorBlock)(ref colors)).colorMultiplier, instant);
			float scale = GetScale();
			StartScaleTween(scale, instant);
		}

		private void StartColorTween(Color color, bool instant)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			((Graphic)targetGraphic).CrossFadeColor(color, instant ? 0f : ((ColorBlock)(ref colors)).fadeDuration, true, true);
		}

		private void StartScaleTween(float scale, bool instant)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			if (scaleTweener != null)
			{
				Vector3 targetScale = default(Vector3);
				((Vector3)(ref targetScale))..ctor(scale, scale, scale);
				scaleTweener.TweenScale(targetScale, instant ? 0f : ((ColorBlock)(ref colors)).fadeDuration, ignoreTimeScale: true);
			}
		}
	}
}
namespace LethalEmotesApi.Ui.Customize.Preview
{
	public class PreviewController : UIBehaviour, IDragHandler, IEventSystemHandler, IScrollHandler
	{
		public GameObject? previewPrefab;

		private GameObject? _previewObjectInstance;

		private Animator? _previewAnimator;

		private PreviewRig? _previewRig;

		private float rotSpeed = 25f;

		protected override void Start()
		{
			((UIBehaviour)this).Start();
			ResetPreviewInstance();
		}

		protected override void OnEnable()
		{
			((UIBehaviour)this).OnEnable();
			ResetPreviewInstance();
		}

		protected override void OnDisable()
		{
			((UIBehaviour)this).OnDisable();
			DestroyPreviewInstance();
		}

		protected override void OnDestroy()
		{
			((UIBehaviour)this).OnDestroy();
			DestroyPreviewInstance();
		}

		public void PlayEmote(string emoteKey)
		{
			if (_previewAnimator != null)
			{
				EmoteUiManager.PlayAnimationOn(_previewAnimator, emoteKey);
			}
		}

		private void ResetPreviewInstance()
		{
			//IL_0024: 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_0051: Unknown result type (might be due to invalid IL or missing references)
			if (previewPrefab != null)
			{
				DestroyPreviewInstance();
				_previewObjectInstance = Object.Instantiate<GameObject>(previewPrefab, ((Component)this).transform.position + new Vector3(0f, -10000f, 0f), Quaternion.Euler(0f, 0f, 0f));
				_previewObjectInstance.SetActive(true);
				_previewAnimator = _previewObjectInstance.GetComponentInChildren<Animator>();
				_previewRig = _previewObjectInstance.GetComponentInChildren<PreviewRig>();
			}
		}

		private void DestroyPreviewInstance()
		{
			if (_previewObjectInstance != null)
			{
				_previewObjectInstance.SetActive(false);
				Object.DestroyImmediate((Object)(object)_previewObjectInstance);
				_previewObjectInstance = null;
				_previewAnimator = null;
				_previewRig = null;
			}
		}

		public void OnDrag(PointerEventData data)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			float vInput = data.delta.y * Time.deltaTime * rotSpeed;
			float hInput = data.delta.x * Time.deltaTime * rotSpeed;
			_previewRig.Orbit(vInput, hInput);
		}

		public void OnScroll(PointerEventData eventData)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			float dir = eventData.scrollDelta.y * 4f;
			_previewRig.Zoom(dir);
		}
	}
	public class PreviewRig : MonoBehaviour
	{
		private readonly TweenRunner<FloatTween> _zoomTweenRunner = new TweenRunner<FloatTween>();

		public Camera? cam;

		protected PreviewRig()
		{
			_zoomTweenRunner.Init((MonoBehaviour)(object)this);
		}

		public void Orbit(float vInput, float hInput)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: 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)
			((Component)this).transform.Rotate(Vector3.right, vInput);
			((Component)this).transform.Rotate(Vector3.up, hInput, (Space)0);
			float num = ClampAngle(((Component)this).transform.localEulerAngles.x, -60f, 60f);
			((Component)this).transform.localEulerAngles = new Vector3(num, ((Component)this).transform.localEulerAngles.y, ((Component)this).transform.localEulerAngles.z);
		}

		private static float ClampAngle(float angle, float min, float max)
		{
			if (min < 0f && max > 0f && (angle > max || angle < min))
			{
				angle -= 360f;
				if (angle > max || angle < min)
				{
					if (Mathf.Abs(Mathf.DeltaAngle(angle, min)) < Mathf.Abs(Mathf.DeltaAngle(angle, max)))
					{
						return min;
					}
					return max;
				}
			}
			else if (min > 0f && (angle > max || angle < min))
			{
				angle += 360f;
				if (angle > max || angle < min)
				{
					if (Mathf.Abs(Mathf.DeltaAngle(angle, min)) < Mathf.Abs(Mathf.DeltaAngle(angle, max)))
					{
						return min;
					}
					return max;
				}
			}
			if (angle < min)
			{
				return min;
			}
			if (angle > max)
			{
				return max;
			}
			return angle;
		}

		public void Zoom(float dir)
		{
			float fieldOfView = cam.fieldOfView;
			fieldOfView -= dir;
			fieldOfView = Mathf.Clamp(fieldOfView, 2f, 154f);
			FloatTween floatTween = default(FloatTween);
			floatTween.Duration = 0.2f;
			floatTween.StartValue = cam.fieldOfView;
			floatTween.TargetValue = fieldOfView;
			floatTween.IgnoreTimeScale = true;
			FloatTween tweenValue = floatTween;
			tweenValue.AddOnChangedCallback(CameraFovTween);
			_zoomTweenRunner.StartTween(tweenValue);
		}

		private void CameraFovTween(float fov)
		{
			cam.fieldOfView = fov;
		}
	}
}
namespace LethalEmotesApi.Ui.Customize.List
{
	[DisallowMultipleComponent]
	public class EmoteBlacklistToggle : UIBehaviour, IPointerEnterHandler, IEventSystemHandler, IPointerExitHandler, IPointerClickHandler
	{
		public EmoteListItem? emoteListItem;

		public Image? toggleImage;

		private string? _emoteKey;

		private bool InBlacklist => EmoteUiManager.RandomPoolBlacklist.Contains<string>(_emoteKey);

		protected override void Start()
		{
			((UIBehaviour)this).Awake();
			UpdateState();
		}

		protected override void OnEnable()
		{
			((UIBehaviour)this).OnEnable();
			UpdateState();
		}

		public void SetEmoteKey(string emoteKey)
		{
			_emoteKey = emoteKey;
			UpdateState();
		}

		public void Toggle()
		{
			if (!string.IsNullOrEmpty(_emoteKey))
			{
				if (InBlacklist)
				{
					EmoteUiManager.RemoveFromRandomPoolBlacklist(_emoteKey);
				}
				else
				{
					EmoteUiManager.AddToRandomPoolBlacklist(_emoteKey);
				}
				UpdateState();
			}
		}

		private void UpdateState()
		{
			if (!string.IsNullOrEmpty(_emoteKey) && toggleImage != null)
			{
				((Behaviour)toggleImage).enabled = InBlacklist;
			}
		}

		public void OnPointerEnter(PointerEventData eventData)
		{
			emoteListItem.OnPointerExit(eventData);
		}

		public void OnPointerExit(PointerEventData eventData)
		{
			emoteListItem.OnPointerEnter(eventData);
		}

		public void OnPointerClick(PointerEventData eventData)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Invalid comparison between Unknown and I4
			if ((int)eventData.button <= 0)
			{
				Toggle();
			}
		}
	}
	[DisallowMultipleComponent]
	public class EmoteList : UIBehaviour
	{
		public RectTransform? listContentContainer;

		public TMP_InputField? searchInputField;

		public GameObject? entryPrefab;

		private CustomizePanel? _customizePanel;

		private readonly List<GameObject> _listObjects = new List<GameObject>();

		private SearchableEmoteArray? _searchableEmoteArray;

		protected override void Awake()
		{
			((UIBehaviour)this).Awake();
			if (searchInputField != null)
			{
				((UnityEvent<string>)(object)searchInputField.onValueChanged).AddListener((UnityAction<string>)SearchFieldUpdated);
			}
		}

		protected override void Start()
		{
			((UIBehaviour)this).Start();
			_searchableEmoteArray = new SearchableEmoteArray(EmoteUiManager.EmoteKeys.ToArray());
			if (_customizePanel == null)
			{
				_customizePanel = ((Component)this).GetComponentInParent<CustomizePanel>();
			}
			InitList();
		}

		protected override void OnEnable()
		{
			((UIBehaviour)this).OnEnable();
			_searchableEmoteArray = new SearchableEmoteArray(EmoteUiManager.EmoteKeys.ToArray());
			if (_customizePanel == null)
			{
				_customizePanel = ((Component)this).GetComponentInParent<CustomizePanel>();
			}
			InitList();
		}

		protected override void OnDisable()
		{
			((UIBehaviour)this).OnDisable();
			if (searchInputField != null)
			{
				searchInputField.text = "";
				if (_searchableEmoteArray != null)
				{
					_searchableEmoteArray.Filter = "";
				}
			}
		}

		private void InitList()
		{
			if (listContentContainer == null || entryPrefab == null || _listObjects.Count > 0)
			{
				return;
			}
			SearchableEmoteArray searchableEmoteArray = _searchableEmoteArray;
			foreach (string item in searchableEmoteArray)
			{
				GameObject val = Object.Instantiate<GameObject>(entryPrefab, (Transform)(object)listContentContainer);
				EmoteListItem component = val.GetComponent<EmoteListItem>();
				component.dragDropController = _customizePanel.dragDropController;
				component.previewController = _customizePanel.previewController;
				component.SetEmoteKey(item);
				_listObjects.Add(val);
			}
		}

		private void ClearList()
		{
			foreach (GameObject listObject in _listObjects)
			{
				Object.DestroyImmediate((Object)(object)listObject);
			}
			_listObjects.Clear();
		}

		private void SearchFieldUpdated(string filter)
		{
			if (_searchableEmoteArray != null)
			{
				_searchableEmoteArray.Filter = filter;
				ClearList();
				InitList();
			}
		}
	}
	public class EmoteListItem : UIBehaviour, IBeginDragHandler, IEventSystemHandler, IDragHandler, IPointerEnterHandler, IPointerExitHandler
	{
		public TextMeshProUGUI? label;

		public EmoteBlacklistToggle? blacklistToggle;

		public Image? selectImage;

		public TextMeshProUGUI? modLabel;

		public EmoteDragDropController? dragDropController;

		public PreviewController? previewController;

		public string? EmoteKey { get; private set; }

		protected override void Start()
		{
			((UIBehaviour)this).Start();
			UpdateState();
		}

		protected override void OnEnable()
		{
			((UIBehaviour)this).OnEnable();
			UpdateState();
		}

		public void OnBeginDrag(PointerEventData eventData)
		{
			StartDrag(eventData);
		}

		public void OnDrag(PointerEventData eventData)
		{
			StartDrag(eventData);
		}

		private void StartDrag(PointerEventData eventData)
		{
			if (EmoteKey == null)
			{
				EmoteKey = ((TMP_Text)label).text;
			}
			dragDropController.StartDrag(EmoteKey, eventData);
			GameObject val = (eventData.pointerDrag = ((Component)dragDropController).gameObject);
			ExecuteEvents.Execute<IDragHandler>(val, (BaseEventData)(object)eventData, ExecuteEvents.dragHandler);
		}

		public void SetEmoteKey(string emoteKey)
		{
			EmoteKey = emoteKey;
			UpdateState();
		}

		private void UpdateState()
		{
			if (EmoteKey == null || label == null)
			{
				return;
			}
			((TMP_Text)label).SetText(EmoteUiManager.GetEmoteName(EmoteKey), true);
			if (modLabel != null)
			{
				((TMP_Text)modLabel).SetText(EmoteUiManager.GetEmoteModName(EmoteKey), true);
				if (blacklistToggle != null)
				{
					blacklistToggle.SetEmoteKey(EmoteKey);
				}
			}
		}

		public void OnPointerEnter(PointerEventData eventData)
		{
			if (selectImage == null)
			{
				return;
			}
			((Behaviour)selectImage).enabled = true;
			if (EmoteKey != null)
			{
				dragDropController.OnCanGrab();
				if (dragDropController.DragState == EmoteDragDropController.DragDropState.Ready)
				{
					previewController.PlayEmote(EmoteKey);
				}
			}
		}

		public void OnPointerExit(PointerEventData eventData)
		{
			if (selectImage != null)
			{
				((Behaviour)selectImage).enabled = false;
				dragDropController.OnNotGrab();
			}
		}
	}
	public class EmoteListScrollRect : ScrollRect
	{
		public override void OnBeginDrag(PointerEventData eventData)
		{
		}

		public override void OnDrag(PointerEventData eventData)
		{
		}

		public override void OnEndDrag(PointerEventData eventData)
		{
		}
	}
}
namespace LethalEmotesApi.Ui.Customize.DragDrop
{
	public class DragDropItem : UIBehaviour
	{
		public TextMeshProUGUI? label;

		public string? EmoteKey { get; private set; }

		protected override void Start()
		{
			((UIBehaviour)this).Start();
			UpdateState();
		}

		protected override void OnEnable()
		{
			((UIBehaviour)this).OnEnable();
			UpdateState();
		}

		public void SetEmoteKey(string emoteKey)
		{
			EmoteKey = emoteKey;
			UpdateState();
		}

		private void UpdateState()
		{
			if (EmoteKey == null || label == null)
			{
				return;
			}
			try
			{
				((TMP_Text)label).SetText(EmoteUiManager.GetEmoteName(EmoteKey), true);
			}
			catch
			{
				((TMP_Text)label).SetText(EmoteKey, true);
			}
		}
	}
	[DisallowMultipleComponent]
	[RequireComponent(typeof(RectTransform))]
	public class EmoteDragDropController : UIBehaviour, IPointerMoveHandler, IEventSystemHandler, IPointerClickHandler, IDragHandler, IEndDragHandler
	{
		public e

plugins/Steven-Custom_Boombox_Music/CustomBoomboxTracks.dll

Decompiled 6 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using CustomBoomboxTracks.Configuration;
using CustomBoomboxTracks.Managers;
using CustomBoomboxTracks.Utilities;
using HarmonyLib;
using UnityEngine;
using UnityEngine.Networking;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("CustomBoomboxTracks")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.4.0.0")]
[assembly: AssemblyInformationalVersion("1.4.0")]
[assembly: AssemblyProduct("CustomBoomboxTracks")]
[assembly: AssemblyTitle("CustomBoomboxTracks")]
[assembly: AssemblyVersion("1.4.0.0")]
namespace CustomBoomboxTracks
{
	[BepInPlugin("com.steven.lethalcompany.boomboxmusic", "Custom Boombox Music", "1.4.0")]
	public class BoomboxPlugin : BaseUnityPlugin
	{
		private const string GUID = "com.steven.lethalcompany.boomboxmusic";

		private const string NAME = "Custom Boombox Music";

		private const string VERSION = "1.4.0";

		private static BoomboxPlugin Instance;

		private void Awake()
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			Instance = this;
			LogInfo("Loading...");
			AudioManager.GenerateFolders();
			Config.Init();
			new Harmony("com.steven.lethalcompany.boomboxmusic").PatchAll();
			LogInfo("Loading Complete!");
		}

		internal static void LogDebug(string message)
		{
			Instance.Log(message, (LogLevel)32);
		}

		internal static void LogInfo(string message)
		{
			Instance.Log(message, (LogLevel)16);
		}

		internal static void LogWarning(string message)
		{
			Instance.Log(message, (LogLevel)4);
		}

		internal static void LogError(string message)
		{
			Instance.Log(message, (LogLevel)2);
		}

		internal static void LogError(Exception ex)
		{
			Instance.Log(ex.Message + "\n" + ex.StackTrace, (LogLevel)2);
		}

		private void Log(string message, LogLevel logLevel)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			((BaseUnityPlugin)this).Logger.Log(logLevel, (object)message);
		}
	}
}
namespace CustomBoomboxTracks.Utilities
{
	public class SharedCoroutineStarter : MonoBehaviour
	{
		private static SharedCoroutineStarter _instance;

		public static Coroutine StartCoroutine(IEnumerator routine)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_instance == (Object)null)
			{
				_instance = new GameObject("Shared Coroutine Starter").AddComponent<SharedCoroutineStarter>();
				Object.DontDestroyOnLoad((Object)(object)_instance);
			}
			return ((MonoBehaviour)_instance).StartCoroutine(routine);
		}
	}
}
namespace CustomBoomboxTracks.Patches
{
	[HarmonyPatch(typeof(BoomboxItem), "PocketItem")]
	internal class BoomboxItem_PocketItem
	{
		private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
		{
			List<CodeInstruction> list = instructions.ToList();
			bool flag = false;
			for (int i = 0; i < list.Count; i++)
			{
				if (!flag)
				{
					if (list[i].opcode == OpCodes.Call)
					{
						flag = true;
					}
					continue;
				}
				if (list[i].opcode == OpCodes.Ret)
				{
					break;
				}
				list[i].opcode = OpCodes.Nop;
			}
			return list;
		}
	}
	[HarmonyPatch(typeof(BoomboxItem), "Start")]
	internal class BoomboxItem_Start
	{
		private static void Postfix(BoomboxItem __instance)
		{
			if (AudioManager.FinishedLoading)
			{
				AudioManager.ApplyClips(__instance);
				return;
			}
			AudioManager.OnAllSongsLoaded += delegate
			{
				AudioManager.ApplyClips(__instance);
			};
		}
	}
	[HarmonyPatch(typeof(BoomboxItem), "StartMusic")]
	internal class BoomboxItem_StartMusic
	{
		private static void Postfix(BoomboxItem __instance, bool startMusic)
		{
			if (startMusic)
			{
				BoomboxPlugin.LogInfo("Playing " + ((Object)__instance.boomboxAudio.clip).name);
			}
		}
	}
	[HarmonyPatch(typeof(StartOfRound), "Awake")]
	internal class StartOfRound_Awake
	{
		private static void Prefix()
		{
			AudioManager.Load();
		}
	}
}
namespace CustomBoomboxTracks.Managers
{
	internal static class AudioManager
	{
		private static string[] allSongPaths;

		private static List<AudioClip> clips = new List<AudioClip>();

		private static bool firstRun = true;

		private static bool finishedLoading = false;

		private static readonly string directory = Path.Combine(Paths.BepInExRootPath, "Custom Songs", "Boombox Music");

		public static bool FinishedLoading => finishedLoading;

		public static bool HasNoSongs => allSongPaths.Length == 0;

		public static event Action OnAllSongsLoaded;

		public static void GenerateFolders()
		{
			Directory.CreateDirectory(directory);
			BoomboxPlugin.LogInfo("Created directory at " + directory);
		}

		public static void Load()
		{
			if (!firstRun)
			{
				return;
			}
			firstRun = false;
			allSongPaths = Directory.GetFiles(directory);
			if (allSongPaths.Length == 0)
			{
				BoomboxPlugin.LogWarning("No songs found!");
				return;
			}
			BoomboxPlugin.LogInfo("Preparing to load AudioClips...");
			List<Coroutine> list = new List<Coroutine>();
			string[] array = allSongPaths;
			for (int i = 0; i < array.Length; i++)
			{
				Coroutine item = SharedCoroutineStarter.StartCoroutine(LoadAudioClip(array[i]));
				list.Add(item);
			}
			SharedCoroutineStarter.StartCoroutine(WaitForAllClips(list));
		}

		private static IEnumerator LoadAudioClip(string filePath)
		{
			BoomboxPlugin.LogInfo("Loading " + filePath + "!");
			if ((int)GetAudioType(filePath) == 0)
			{
				BoomboxPlugin.LogError("Failed to load AudioClip from " + filePath + "\nUnsupported file extension!");
				yield break;
			}
			UnityWebRequest loader = UnityWebRequestMultimedia.GetAudioClip(filePath, GetAudioType(filePath));
			if (Config.StreamFromDisk)
			{
				DownloadHandler downloadHandler = loader.downloadHandler;
				((DownloadHandlerAudioClip)((downloadHandler is DownloadHandlerAudioClip) ? downloadHandler : null)).streamAudio = true;
			}
			loader.SendWebRequest();
			while (!loader.isDone)
			{
				yield return null;
			}
			if (loader.error != null)
			{
				BoomboxPlugin.LogError("Error loading clip from path: " + filePath + "\n" + loader.error);
				BoomboxPlugin.LogError(loader.error);
				yield break;
			}
			AudioClip content = DownloadHandlerAudioClip.GetContent(loader);
			if (Object.op_Implicit((Object)(object)content) && (int)content.loadState == 2)
			{
				BoomboxPlugin.LogInfo("Loaded " + filePath);
				((Object)content).name = Path.GetFileName(filePath);
				clips.Add(content);
			}
			else
			{
				BoomboxPlugin.LogError("Failed to load clip at: " + filePath + "\nThis might be due to an mismatch between the audio codec and the file extension!");
			}
		}

		private static IEnumerator WaitForAllClips(List<Coroutine> coroutines)
		{
			foreach (Coroutine coroutine in coroutines)
			{
				yield return coroutine;
			}
			clips.Sort((AudioClip first, AudioClip second) => ((Object)first).name.CompareTo(((Object)second).name));
			finishedLoading = true;
			AudioManager.OnAllSongsLoaded?.Invoke();
			AudioManager.OnAllSongsLoaded = null;
		}

		public static void ApplyClips(BoomboxItem __instance)
		{
			BoomboxPlugin.LogInfo("Applying clips!");
			if (Config.UseDefaultSongs)
			{
				__instance.musicAudios = __instance.musicAudios.Concat(clips).ToArray();
			}
			else
			{
				__instance.musicAudios = clips.ToArray();
			}
			BoomboxPlugin.LogInfo($"Total Clip Count: {__instance.musicAudios.Length}");
		}

		private static AudioType GetAudioType(string path)
		{
			string text = Path.GetExtension(path).ToLower();
			switch (text)
			{
			case ".wav":
				return (AudioType)20;
			case ".ogg":
				return (AudioType)14;
			case ".mp3":
				return (AudioType)13;
			default:
				BoomboxPlugin.LogError("Unsupported extension type: " + text);
				return (AudioType)0;
			}
		}
	}
}
namespace CustomBoomboxTracks.Configuration
{
	internal static class Config
	{
		private const string CONFIG_FILE_NAME = "boombox.cfg";

		private static ConfigFile _config;

		private static ConfigEntry<bool> _useDefaultSongs;

		private static ConfigEntry<bool> _streamAudioFromDisk;

		public static bool UseDefaultSongs
		{
			get
			{
				if (!_useDefaultSongs.Value)
				{
					return AudioManager.HasNoSongs;
				}
				return true;
			}
		}

		public static bool StreamFromDisk => _streamAudioFromDisk.Value;

		public static void Init()
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			BoomboxPlugin.LogInfo("Initializing config...");
			_config = new ConfigFile(Path.Combine(Paths.ConfigPath, "boombox.cfg"), true);
			_useDefaultSongs = _config.Bind<bool>("Config", "Use Default Songs", false, "Include the default songs in the rotation.");
			_streamAudioFromDisk = _config.Bind<bool>("Config", "Stream Audio From Disk", false, "Requires less memory and takes less time to load, but prevents playing the same song twice at once.");
			BoomboxPlugin.LogInfo("Config initialized!");
		}

		private static void PrintConfig()
		{
			BoomboxPlugin.LogInfo($"Use Default Songs: {_useDefaultSongs.Value}");
			BoomboxPlugin.LogInfo($"Stream From Disk: {_streamAudioFromDisk}");
		}
	}
}