Decompiled source of STSharedAudioLib v0.0.2

STSharedAudioLib.dll

Decompiled 3 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
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("STSharedAudioLib")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("A standalone Component storing Lists of AudioClips to access from different mods.")]
[assembly: AssemblyFileVersion("0.0.2.0")]
[assembly: AssemblyInformationalVersion("0.0.2")]
[assembly: AssemblyProduct("STSharedAudioLib")]
[assembly: AssemblyTitle("STSharedAudioLib")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.2.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace STSharedAudioLib
{
	public class AudioClipWithWeight : ScriptableObject
	{
		public AudioClip audioClip;

		public int weight;
	}
	public class AudioList : ScriptableObject
	{
		public List<AudioClipWithWeight> weightedClipsList = new List<AudioClipWithWeight>();

		public int listWeight;
	}
	[BepInPlugin("STSharedAudioLib", "STSharedAudioLib", "0.0.2")]
	public class Plugin : BaseUnityPlugin
	{
		internal static ManualLogSource Logger;

		private void Awake()
		{
			Logger = ((BaseUnityPlugin)this).Logger;
			Logger.LogInfo((object)"Plugin STSharedAudioLib is loaded!");
		}
	}
	public class SharedAudioComponent : MonoBehaviour
	{
		public List<AudioList> allAudioLists = new List<AudioList>();
	}
	public class SharedAudioMethods
	{
		public static SharedAudioComponent GetSharedAudioComponent(GameObject objectToCheck, bool printDebug = false, string newListName = null, int newListWeight = 100, bool makeNewListUponComponentAdd = true)
		{
			if ((Object)(object)objectToCheck == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"GetSharedAudioComponent() was called with a null GameObject, please specify what GameObject a SharedAudioComponent must be gotten from or added to, returning null");
				return null;
			}
			SharedAudioComponent sharedAudioComponent = objectToCheck.GetComponent<SharedAudioComponent>();
			if ((Object)(object)sharedAudioComponent == (Object)null)
			{
				sharedAudioComponent = objectToCheck.AddComponent<SharedAudioComponent>();
				CheckComponentListForNull(sharedAudioComponent, printDebug, makeNewListUponComponentAdd, newListName, newListWeight);
				if (printDebug)
				{
					Plugin.Logger.LogDebug((object)("added SharedAudioComponent to object " + ((Object)objectToCheck).name));
				}
			}
			else if (printDebug)
			{
				Plugin.Logger.LogDebug((object)("got existing SharedAudioComponent on object " + ((Object)objectToCheck).name));
			}
			return sharedAudioComponent;
		}

		public static void CleanSharedAudioComponent(GameObject objectToClean, bool printDebug = false, bool removeNullAudioClips = true, bool removeNullAudioLists = true, bool removeDuplicates = true, bool removeDuplicateAudioClipsWithDifferentWeight = true)
		{
			CleanSharedAudioComponent(GetSharedAudioComponent(objectToClean, printDebug), printDebug, removeNullAudioClips, removeNullAudioLists, removeDuplicates, removeDuplicateAudioClipsWithDifferentWeight);
		}

		public static void CleanSharedAudioComponent(SharedAudioComponent audioComponent, bool printDebug = false, bool removeNullAudioClips = true, bool removeNullAudioLists = true, bool removeDuplicates = true, bool removeDuplicateAudioClipsWithDifferentWeight = true)
		{
			if ((Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"CleanSharedAudioComponent() was called with a null SharedAudioComponent, please specify what SharedAudioComponent to clean");
				return;
			}
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)("got call to clean up SharedAudioComponent on object " + ((Object)((Component)audioComponent).gameObject).name));
			}
			if (removeNullAudioClips || removeNullAudioLists)
			{
				RemoveNull(audioComponent, printDebug, -1, removeNullAudioClips, removeNullAudioLists);
			}
			if (removeDuplicates)
			{
				RemoveDuplicates(audioComponent, printDebug, removeDuplicateAudioClipsWithDifferentWeight);
			}
		}

		public static void CleanEverySharedAudioComponent(GameObject[] allObjectsToClean = null, bool printDebug = false, bool removeNullAudioClips = true, bool removeNullAudioLists = true, bool removeDuplicates = true, bool removeDuplicateAudioClipsWithDifferentWeight = true)
		{
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)"got call to clean up every single GameObject's SharedAudioComponent!");
			}
			if (allObjectsToClean == null)
			{
				allObjectsToClean = Object.FindObjectsOfType<GameObject>();
			}
			GameObject[] array = allObjectsToClean;
			foreach (GameObject val in array)
			{
				if ((Object)(object)val.GetComponent<SharedAudioComponent>() != (Object)null)
				{
					SharedAudioComponent[] components = val.GetComponents<SharedAudioComponent>();
					foreach (SharedAudioComponent audioComponent in components)
					{
						CleanSharedAudioComponent(audioComponent, printDebug, removeNullAudioClips, removeNullAudioLists, removeDuplicates, removeDuplicateAudioClipsWithDifferentWeight);
					}
				}
			}
		}

		public static void CleanEverySharedAudioComponent(SharedAudioComponent[] allAudioComponents = null, bool printDebug = false, bool removeNullAudioClips = true, bool removeNullAudioLists = true, bool removeDuplicates = true, bool removeDuplicateAudioClipsWithDifferentWeight = true)
		{
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)"got call to clean up every single SharedAudioComponent!");
			}
			if (allAudioComponents == null)
			{
				allAudioComponents = Object.FindObjectsOfType<SharedAudioComponent>();
			}
			SharedAudioComponent[] array = allAudioComponents;
			foreach (SharedAudioComponent audioComponent in array)
			{
				CleanSharedAudioComponent(audioComponent, printDebug, removeNullAudioClips, removeNullAudioLists, removeDuplicates, removeDuplicateAudioClipsWithDifferentWeight);
			}
		}

		public static AudioList AudioListCreateNew(GameObject objectToAdd, bool printDebug = false, string newListName = null, int newListWeight = 100)
		{
			return AudioListCreateNew(GetSharedAudioComponent(objectToAdd, printDebug), printDebug, newListName, newListWeight);
		}

		public static AudioList AudioListCreateNew(SharedAudioComponent audioComponent, bool printDebug = false, string newListName = null, int newListWeight = 100)
		{
			if ((Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioListCreateNew() was called with a null SharedAudioComponent, please specify what SharedAudioComponent to add an AudioList to, returning null");
				return null;
			}
			AudioList audioList = ScriptableObject.CreateInstance<AudioList>();
			if (newListName == null)
			{
				((Object)audioList).name = $"{((Object)((Component)audioComponent).gameObject).name} // AudioList{audioComponent.allAudioLists.Count}";
				if (printDebug)
				{
					Plugin.Logger.LogDebug((object)("AudioListCreateNew() was not given a specified listName, creating new AudioList with name '" + ((Object)audioList).name + "'"));
				}
			}
			else if (!IsListNameUnique(audioComponent, newListName))
			{
				((Object)audioList).name = $"{((Object)((Component)audioComponent).gameObject).name} // AudioList{audioComponent.allAudioLists.Count}";
				if (printDebug)
				{
					Plugin.Logger.LogDebug((object)("allAudioLists on object " + ((Object)((Component)audioComponent).gameObject).name + " already had an AudioList with name '" + newListName + "', creating new AudioList with name '" + ((Object)audioList).name + "'"));
				}
			}
			else
			{
				((Object)audioList).name = newListName;
			}
			if (newListWeight <= 0)
			{
				audioList.listWeight = 100;
				Plugin.Logger.LogWarning((object)$"AudioListCreateNew() was called with an invalid newListWeight value of {newListWeight}, only positive values above zero allowed, creating new AudioList with weight {audioList.listWeight}");
			}
			else
			{
				audioList.listWeight = newListWeight;
			}
			audioComponent.allAudioLists.Add(audioList);
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)$"created new AudioList with name '{((Object)audioList).name}' and weight {audioList.listWeight} at index [{audioComponent.allAudioLists.Count - 1}] on object {((Object)((Component)audioComponent).gameObject).name}");
			}
			return audioList;
		}

		public static AudioList AudioListGetDefault(GameObject objectToCheck, bool printDebug = false, bool createListIfNull = true)
		{
			return AudioListGetDefault(GetSharedAudioComponent(objectToCheck, printDebug), printDebug, createListIfNull);
		}

		public static AudioList AudioListGetDefault(SharedAudioComponent audioComponent, bool printDebug = false, bool createListIfNull = true)
		{
			if ((Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioListGetDefault() was called with a null SharedAudioComponent, please specify what SharedAudioComponent to get the first AudioList from, returning null");
				return null;
			}
			CheckComponentListForNull(audioComponent, printDebug, createListIfNull);
			if (audioComponent.allAudioLists.Count == 0)
			{
				Plugin.Logger.LogWarning((object)("SharedAudioComponent on object '" + ((Object)((Component)audioComponent).gameObject).name + "' did not contain any AudioLists, returning null"));
				return null;
			}
			AudioList audioList = audioComponent.allAudioLists[0];
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)$"found AudioList with name '{((Object)audioList).name}' at index [{audioComponent.allAudioLists[0]}] on object {((Object)((Component)audioComponent).gameObject).name}");
			}
			return audioList;
		}

		public static AudioList AudioListGetByName(string nameListToSearch, GameObject objectToCheck, bool printDebug = false, bool createListIfNull = true)
		{
			return AudioListGetByName(nameListToSearch, GetSharedAudioComponent(objectToCheck, printDebug), printDebug, createListIfNull);
		}

		public static AudioList AudioListGetByName(string nameListToSearch, SharedAudioComponent audioComponent, bool printDebug = false, bool createListIfNull = true)
		{
			if (nameListToSearch == null || (Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioListGetByname() was called with a null nameListToSearch and/or SharedAudioComponent, please specify what name to search for on what SharedAudioComponent, returning null");
				return null;
			}
			CheckComponentListForNull(audioComponent, printDebug, createListIfNull, nameListToSearch);
			if (audioComponent.allAudioLists.Count == 0)
			{
				Plugin.Logger.LogWarning((object)("SharedAudioComponent on object '" + ((Object)((Component)audioComponent).gameObject).name + "' did not contain any AudioLists, returning null"));
				return null;
			}
			for (int i = 0; i < audioComponent.allAudioLists.Count; i++)
			{
				AudioList audioList = audioComponent.allAudioLists[i];
				if (((Object)audioList).name == nameListToSearch)
				{
					if (printDebug)
					{
						Plugin.Logger.LogDebug((object)$"found AudioList with name '{((Object)audioList).name}' at index [{i}] on object {((Object)((Component)audioComponent).gameObject).name}");
					}
					return audioList;
				}
			}
			if (createListIfNull)
			{
				if (printDebug)
				{
					Plugin.Logger.LogDebug((object)("AudioListGetByName() called with nameListToSearch that was not yet present on object " + ((Object)((Component)audioComponent).gameObject).name + ", creating new AudioList with name '" + nameListToSearch + "'"));
				}
				return AudioListCreateNew(audioComponent, printDebug, nameListToSearch);
			}
			Plugin.Logger.LogWarning((object)("no AudioList with name '" + nameListToSearch + "' was found on object " + ((Object)((Component)audioComponent).gameObject).name + ", returning first AudioList in allAudioLists"));
			return audioComponent.allAudioLists[0];
		}

		public static AudioList AudioListGetLongest(GameObject objectToCheck, bool printDebug = false, bool createListIfNull = true)
		{
			return AudioListGetLongest(GetSharedAudioComponent(objectToCheck, printDebug), printDebug, createListIfNull);
		}

		public static AudioList AudioListGetLongest(SharedAudioComponent audioComponent, bool printDebug = false, bool createListIfNull = true)
		{
			if ((Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioListGetLongest() was called with a null SharedAudioComponent, please specify what SharedAudioComponent to get the longest AudioList from, returning null");
				return null;
			}
			CheckComponentListForNull(audioComponent, printDebug, createListIfNull);
			if (audioComponent.allAudioLists.Count == 0)
			{
				Plugin.Logger.LogWarning((object)("SharedAudioComponent on object '" + ((Object)((Component)audioComponent).gameObject).name + "' did not contain any AudioLists, returning null"));
				return null;
			}
			int num = 0;
			int num2 = 0;
			for (int i = 0; i < audioComponent.allAudioLists.Count; i++)
			{
				if (audioComponent.allAudioLists[i].weightedClipsList.Count > num)
				{
					num = audioComponent.allAudioLists[i].weightedClipsList.Count;
					num2 = i;
				}
			}
			if (num == 0)
			{
				Plugin.Logger.LogWarning((object)("error while searching for longest AudioList on object " + ((Object)((Component)audioComponent).gameObject).name + ", returning first AudioList in allAudioLists"));
			}
			if (printDebug && num != 0)
			{
				Plugin.Logger.LogDebug((object)$"found longest AudioList with name '{((Object)audioComponent.allAudioLists[num2]).name}' at index [{num2}] on object {((Object)((Component)audioComponent).gameObject).name}");
			}
			return audioComponent.allAudioLists[num2];
		}

		public static AudioList AudioListGetShortest(GameObject objectToCheck, bool printDebug = false, bool createListIfNull = true)
		{
			return AudioListGetShortest(GetSharedAudioComponent(objectToCheck, printDebug), printDebug, createListIfNull);
		}

		public static AudioList AudioListGetShortest(SharedAudioComponent audioComponent, bool printDebug = false, bool createListIfNull = true)
		{
			if ((Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioListGetShortest() was called with a null SharedAudioComponent, please specify what SharedAudioComponent to get the shortest AudioList from, returning null");
				return null;
			}
			CheckComponentListForNull(audioComponent, printDebug, createListIfNull);
			if (audioComponent.allAudioLists.Count == 0)
			{
				Plugin.Logger.LogWarning((object)("SharedAudioComponent on object '" + ((Object)((Component)audioComponent).gameObject).name + "' did not contain any AudioLists, returning null"));
				return null;
			}
			int num = 999999999;
			int num2 = 0;
			for (int i = 0; i < audioComponent.allAudioLists.Count; i++)
			{
				if (audioComponent.allAudioLists[i].weightedClipsList.Count < num)
				{
					num = audioComponent.allAudioLists[i].weightedClipsList.Count;
					num2 = i;
				}
			}
			if (num == 999999999)
			{
				Plugin.Logger.LogWarning((object)("error while searching for shortest AudioList on object " + ((Object)((Component)audioComponent).gameObject).name + ", returning first AudioList in allAudioLists"));
			}
			if (printDebug && num != 999999999)
			{
				Plugin.Logger.LogDebug((object)$"found shortest AudioList with name '{((Object)audioComponent.allAudioLists[num2]).name}' at index [{num2}] on object {((Object)((Component)audioComponent).gameObject).name}");
			}
			return audioComponent.allAudioLists[num2];
		}

		public static AudioList AudioListGetRandom(GameObject objectToCheck, bool printDebug = false, bool createListIfNull = true)
		{
			SharedAudioComponent[] components = objectToCheck.GetComponents<SharedAudioComponent>();
			int num = Random.Range(0, components.Length);
			return AudioListGetRandom(components[num], printDebug, createListIfNull);
		}

		public static AudioList AudioListGetRandom(SharedAudioComponent audioComponent, bool printDebug = false, bool createListIfNull = true)
		{
			if ((Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioListGetRandom() was called with a null SharedAudioComponent, please specify what SharedAudioComponent to get a random AudioList from, returning null");
				return null;
			}
			CheckComponentListForNull(audioComponent, printDebug, createListIfNull);
			if (audioComponent.allAudioLists.Count == 0)
			{
				Plugin.Logger.LogWarning((object)("SharedAudioComponent on object '" + ((Object)((Component)audioComponent).gameObject).name + "' did not contain any AudioLists, returning null"));
				return null;
			}
			int num = Random.Range(0, audioComponent.allAudioLists.Count);
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)$"returned AudioList with name '{((Object)audioComponent.allAudioLists[num]).name}' at random index [{num}] on object {((Object)((Component)audioComponent).gameObject).name}");
			}
			return audioComponent.allAudioLists[num];
		}

		public static AudioList AudioListGetRandomByWeight(GameObject objectToCheck, bool printDebug = false, bool createListIfNull = true)
		{
			SharedAudioComponent[] components = objectToCheck.GetComponents<SharedAudioComponent>();
			int num = Random.Range(0, components.Length);
			return AudioListGetRandomByWeight(components[num], printDebug, createListIfNull);
		}

		public static AudioList AudioListGetRandomByWeight(SharedAudioComponent audioComponent, bool printDebug = false, bool createListIfNull = true)
		{
			if ((Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioListGetRandomByWeight() was called with a null SharedAudioComponent, please specify what SharedAudioComponent to get a random weighted AudioList from, returning null");
				return null;
			}
			CheckComponentListForNull(audioComponent, printDebug, createListIfNull);
			if (audioComponent.allAudioLists.Count == 0)
			{
				Plugin.Logger.LogWarning((object)("SharedAudioComponent on object '" + ((Object)((Component)audioComponent).gameObject).name + "' did not contain any AudioLists, returning null"));
				return null;
			}
			int num = AddUpAllWeights(audioComponent);
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)$"got totalWeight {num} from SharedAudioComponent on object {((Object)((Component)audioComponent).gameObject).name}");
			}
			int num2 = Random.Range(0, num + 1);
			int num3 = 0;
			int num4 = -1;
			for (int i = 0; i < audioComponent.allAudioLists.Count; i++)
			{
				num3 += audioComponent.allAudioLists[i].listWeight;
				if (num2 > num4 && num2 <= num3)
				{
					if (printDebug)
					{
						Plugin.Logger.LogDebug((object)$"returned AudioList with name '{((Object)audioComponent.allAudioLists[i]).name}' at index [{i}] on object {((Object)((Component)audioComponent).gameObject).name} after getting random weight {num2}");
					}
					return audioComponent.allAudioLists[i];
				}
			}
			Plugin.Logger.LogWarning((object)$"error occured while looking for random weight {num2} in SharedAudioComponent on object {((Object)((Component)audioComponent).gameObject).name}, returning first AudioList in allAudioLists");
			return AudioListGetDefault(audioComponent);
		}

		public static int AudioListGetIndex(AudioList audioList, GameObject objectToCheck, bool printDebug = false, bool createListIfNull = true, bool addListIfNotFound = true)
		{
			return AudioListGetIndex(audioList, GetSharedAudioComponent(objectToCheck, printDebug), printDebug, createListIfNull, addListIfNotFound);
		}

		public static int AudioListGetIndex(AudioList audioList, SharedAudioComponent audioComponent, bool printDebug = false, bool createListIfNull = true, bool addListIfNotFound = true)
		{
			if ((Object)(object)audioList == (Object)null || (Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioListGetIndex() was called with a null AudioList and/or SharedAudioComponent, please specify what AudioList's index to get on what SharedAudioComponent, returning zero");
				return 0;
			}
			CheckComponentListForNull(audioComponent, printDebug, createListIfNull);
			if (audioComponent.allAudioLists.Count == 0)
			{
				Plugin.Logger.LogWarning((object)("SharedAudioComponent on object '" + ((Object)((Component)audioComponent).gameObject).name + "' did not contain any AudioLists, returning zero"));
				return 0;
			}
			for (int i = 0; i < audioComponent.allAudioLists.Count; i++)
			{
				AudioList audioList2 = audioComponent.allAudioLists[i];
				if ((Object)(object)audioList2 == (Object)(object)audioList)
				{
					if (printDebug)
					{
						Plugin.Logger.LogDebug((object)$"returned index [{i}] for AudioList with name '{((Object)audioList).name}' on object {((Object)((Component)audioComponent).gameObject).name}");
					}
					return i;
				}
			}
			if (addListIfNotFound)
			{
				audioComponent.allAudioLists.Add(audioList);
				if (printDebug)
				{
					Plugin.Logger.LogDebug((object)("AudioListGetIndex() called with an AudioList that was not yet present, adding AudioList with name '" + ((Object)audioList).name + "' to SharedAudioComponent on object " + ((Object)((Component)audioComponent).gameObject).name));
				}
				return audioComponent.allAudioLists.Count - 1;
			}
			Plugin.Logger.LogWarning((object)("no AudioList with name '" + ((Object)audioList).name + "' was found, returning first index in allAudioLists"));
			return 0;
		}

		public static AudioList AudioListGetNextInAllAudioLists(AudioList audioList, GameObject objectToCheck, bool printDebug = false, bool createListIfNull = true)
		{
			return AudioListGetNextInAllAudioLists(audioList, objectToCheck, printDebug, createListIfNull);
		}

		public static AudioList AudioListGetNextInAllAudioLists(AudioList audioList, SharedAudioComponent audioComponent, bool printDebug = false, bool createListIfNull = true)
		{
			if ((Object)(object)audioList == (Object)null || (Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioListGetNextInAllAudioLists() was called with a null AudioList and/or SharedAudioComponent, please specify what next AudioList index to get on what SharedAudioComponent, returning null");
				return null;
			}
			CheckComponentListForNull(audioComponent, printDebug, createListIfNull);
			if (audioComponent.allAudioLists.Count == 0)
			{
				Plugin.Logger.LogWarning((object)("SharedAudioComponent on object '" + ((Object)((Component)audioComponent).gameObject).name + "' did not contain any AudioLists, returning null"));
				return null;
			}
			int num = AudioListGetIndex(audioList, audioComponent) + 1;
			if (num == audioComponent.allAudioLists.Count)
			{
				num = 0;
			}
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)$"returned next AudioList with name '{((Object)audioList).name}' on object {((Object)((Component)audioComponent).gameObject).name} at index [{num}]");
			}
			return audioComponent.allAudioLists[num];
		}

		public static bool AudioListContainsAudioClip(GameObject objectToCheck, AudioClip audioClip, bool printDebug = false, int weightToLookFor = -1)
		{
			if ((Object)(object)audioClip == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioListContainsAudioClip() called with a null AudioClip, please provide an AudioClip to search for, returning false");
				return false;
			}
			if ((Object)(object)objectToCheck == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioListContainsAudioClip called with a null GameObject, please specify what GameObject to search, returning false");
				return false;
			}
			SharedAudioComponent[] components = objectToCheck.GetComponents<SharedAudioComponent>();
			foreach (SharedAudioComponent audioComponent in components)
			{
				if (!AudioListContainsAudioClip(audioComponent, audioClip, printDebug, weightToLookFor))
				{
					continue;
				}
				if (printDebug)
				{
					if (weightToLookFor <= 0)
					{
						Plugin.Logger.LogDebug((object)("successfully found AudioClip with name '" + ((Object)audioClip).name + "' on object " + ((Object)objectToCheck).name));
					}
					else
					{
						Plugin.Logger.LogDebug((object)$"successfully found AudioClipWithWeight with AudioClip with name '{((Object)audioClip).name}' and weight {weightToLookFor} on object {((Object)objectToCheck).name}");
					}
				}
				return true;
			}
			if (printDebug)
			{
				if (weightToLookFor <= 0)
				{
					Plugin.Logger.LogDebug((object)("did not find AudioClip with name '" + ((Object)audioClip).name + "' on object " + ((Object)objectToCheck).name));
				}
				else
				{
					Plugin.Logger.LogDebug((object)$"did not find AudioClipWithWeight with AudioClip with name '{((Object)audioClip).name}' and weight {weightToLookFor} on object {((Object)objectToCheck).name}");
				}
			}
			return false;
		}

		public static bool AudioListContainsAudioClip(SharedAudioComponent audioComponent, AudioClip audioClip, bool printDebug = false, int weightToLookFor = -1)
		{
			if ((Object)(object)audioClip == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioListContainsAudioClip() called with a null AudioClip, please provide an AudioClip to search for, returning false");
				return false;
			}
			if ((Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioListContainsAudioClip() called with a null SharedAudioComponent, please specify in what SharedAudioComponent to search, returning false");
				return false;
			}
			foreach (AudioList allAudioList in audioComponent.allAudioLists)
			{
				if (!AudioListContainsAudioClip(allAudioList, audioClip, printDebug, weightToLookFor))
				{
					continue;
				}
				if (printDebug)
				{
					if (weightToLookFor <= 0)
					{
						Plugin.Logger.LogDebug((object)("successfully found AudioClip with name '" + ((Object)audioClip).name + "' in SharedAudioComponent on object " + ((Object)((Component)audioComponent).gameObject).name));
					}
					else
					{
						Plugin.Logger.LogDebug((object)$"successfully found AudioClipWithWeight with AudioClip with name '{((Object)audioClip).name}' and weight {weightToLookFor} in SharedAudioComponent on object {((Object)((Component)audioComponent).gameObject).name}");
					}
				}
				return true;
			}
			if (printDebug)
			{
				if (weightToLookFor <= 0)
				{
					Plugin.Logger.LogDebug((object)("did not find AudioClip with name '" + ((Object)audioClip).name + "' in SharedAudioComponent on object " + ((Object)((Component)audioComponent).gameObject).name));
				}
				else
				{
					Plugin.Logger.LogDebug((object)$"did not find AudioClipWithWeight with AudioClip with name '{((Object)audioClip).name}' and weight {weightToLookFor} in SharedAudioComponent on object {((Object)((Component)audioComponent).gameObject).name}");
				}
			}
			return false;
		}

		public static bool AudioListContainsAudioClip(AudioList audioList, AudioClip audioClip, bool printDebug = false, int weightToLookFor = -1)
		{
			if ((Object)(object)audioClip == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioListContainsAudioClip() called with a null AudioClip, please provide an AudioClip to search for, returning false");
				return false;
			}
			if ((Object)(object)audioList == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioListContainsAudioClip() called with a null AudioList, please specify in what AudioList to search, returning false");
				return false;
			}
			foreach (AudioClipWithWeight weightedClips in audioList.weightedClipsList)
			{
				if (!((Object)(object)weightedClips.audioClip == (Object)(object)audioClip))
				{
					continue;
				}
				if (weightToLookFor <= 0)
				{
					if (printDebug)
					{
						Plugin.Logger.LogDebug((object)("successfully found AudioClip with name '" + ((Object)weightedClips.audioClip).name + "' in AudioList with name '" + ((Object)audioList).name + "'"));
					}
					return true;
				}
				if (weightedClips.weight == weightToLookFor)
				{
					if (printDebug)
					{
						Plugin.Logger.LogDebug((object)$"successfully found AudioClipWithWeight with AudioClip with name '{((Object)weightedClips.audioClip).name}' and weight {weightedClips.weight} in AudioList with name '{((Object)audioList).name}'");
					}
					return true;
				}
			}
			if (printDebug)
			{
				if (weightToLookFor <= 0)
				{
					Plugin.Logger.LogDebug((object)("did not find AudioClip with name '" + ((Object)audioClip).name + "' in AudioList with name '" + ((Object)audioList).name + "'"));
				}
				else
				{
					Plugin.Logger.LogDebug((object)$"did not find AudioClipWithWeight with AudioClip with name '{((Object)audioClip).name}' and weight {weightToLookFor} in AudioList with name '{((Object)audioList).name}'");
				}
			}
			return false;
		}

		public static void RemoveAudioList(AudioList audioList, GameObject objectToRemoveFrom, bool printDebug = false)
		{
			RemoveAudioList(audioList, GetSharedAudioComponent(objectToRemoveFrom, printDebug), printDebug);
		}

		public static void RemoveAudioList(AudioList audioList, SharedAudioComponent audioComponent, bool printDebug = false)
		{
			if ((Object)(object)audioList == (Object)null || (Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"RemoveAudioList() was called was a null AudioList and/or SharedAudioComponent, please specify what SharedAudioComponent to remove what AudioList from, returning");
				return;
			}
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)("received call to remove AudioList with name '" + ((Object)audioList).name + "' from allAudioLists on object " + ((Object)((Component)audioComponent).gameObject).name));
			}
			if (audioComponent.allAudioLists.Count == 0)
			{
				if (printDebug)
				{
					Plugin.Logger.LogDebug((object)("SharedAudioComponent on object " + ((Object)((Component)audioComponent).gameObject).name + " does not have any AudioLists to remove, returning"));
				}
				return;
			}
			int count = audioComponent.allAudioLists.Count;
			List<AudioList> list = new List<AudioList>();
			for (int i = 0; i < audioComponent.allAudioLists.Count; i++)
			{
				if ((Object)(object)audioComponent.allAudioLists[i] == (Object)(object)audioList)
				{
					list.Add(audioComponent.allAudioLists[i]);
				}
			}
			if (list.Count > 0)
			{
				foreach (AudioList item in list)
				{
					if (printDebug)
					{
						Plugin.Logger.LogDebug((object)$"removing AudioList at index '{item}' on object {((Object)((Component)audioComponent).gameObject).name}");
					}
					audioComponent.allAudioLists.Remove(item);
				}
			}
			int count2 = audioComponent.allAudioLists.Count;
			if (count > count2 && printDebug)
			{
				Plugin.Logger.LogDebug((object)$"removed {count - count2} AudioLists in SharedAudioComponent on object {((Object)((Component)audioComponent).gameObject).name}");
			}
		}

		public static void RemoveAudioClip(AudioClip audioClip, GameObject objectToRemoveFrom, bool printDebug = false)
		{
			RemoveAudioClip(audioClip, GetSharedAudioComponent(objectToRemoveFrom, printDebug), printDebug);
		}

		public static void RemoveAudioClip(AudioClip audioClip, SharedAudioComponent audioComponent, bool printDebug = false)
		{
			if ((Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"RemoveAudioClip() was called with a null SharedAudioComponent, please specify what AudioClip to remove from what SharedAudioComponent, returning");
				return;
			}
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)("received call to remove AudioClip with name '" + ((Object)audioClip).name + "' from SharedAudioComponent on object " + ((Object)((Component)audioComponent).gameObject).name));
			}
			if (audioComponent.allAudioLists.Count == 0)
			{
				if (printDebug)
				{
					Plugin.Logger.LogDebug((object)("SharedAudioComponent on object '" + ((Object)((Component)audioComponent).gameObject).name + "' does not have any AudioLists to remove AudioClips from, returning"));
				}
				return;
			}
			foreach (AudioList allAudioList in audioComponent.allAudioLists)
			{
				RemoveAudioClip(audioClip, allAudioList, printDebug);
			}
		}

		public static void RemoveAudioClip(AudioClip audioClip, AudioList audioList, bool printDebug = false)
		{
			if ((Object)(object)audioClip == (Object)null || (Object)(object)audioList == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"RemoveAudioClip() was called with a null AudioClip and/or AudioList, please specify what AudioClip to remove from what AudioList, returning");
				return;
			}
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)("received call to remove AudioClip with name '" + ((Object)audioClip).name + "' from AudioList with name '" + ((Object)audioList).name + "'"));
			}
			if (audioList.weightedClipsList.Count == 0)
			{
				if (printDebug)
				{
					Plugin.Logger.LogDebug((object)("AudioList with name '" + ((Object)audioList).name + "' does not have any AudioClips to remove, returning"));
				}
				return;
			}
			int count = audioList.weightedClipsList.Count;
			List<AudioClipWithWeight> list = new List<AudioClipWithWeight>();
			for (int i = 0; i < audioList.weightedClipsList.Count; i++)
			{
				if ((Object)(object)audioList.weightedClipsList[i].audioClip == (Object)(object)audioClip)
				{
					list.Add(audioList.weightedClipsList[i]);
				}
			}
			if (list.Count > 0)
			{
				foreach (AudioClipWithWeight item in list)
				{
					if (printDebug)
					{
						Plugin.Logger.LogDebug((object)$"removing AudioClip with name '{item}' on AudioList with name '{((Object)audioList).name}'");
					}
					audioList.weightedClipsList.Remove(item);
				}
			}
			int count2 = audioList.weightedClipsList.Count;
			if (count > count2 && printDebug)
			{
				Plugin.Logger.LogDebug((object)$"removed {count - count2} AudioClips in AudioList with name '{((Object)audioList).name}'");
			}
		}

		public static void RemoveAudioClipRange(AudioClip[] audioClips, GameObject objectToRemoveFrom, bool printDebug = false)
		{
			RemoveAudioClipRange(audioClips, GetSharedAudioComponent(objectToRemoveFrom, printDebug), printDebug);
		}

		public static void RemoveAudioClipRange(AudioClip[] audioClips, SharedAudioComponent audioComponent, bool printDebug = false)
		{
			if (audioClips == null || audioClips.Length == 0 || (Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"RemoveAudioClipRange() was called with a null AudioClip array, an AudioClip array with no AudioClips, or a null SharedAudioComponent, please specify which AudioClips to remove from which SharedAudioComponent, returning");
				return;
			}
			foreach (AudioClip audioClip in audioClips)
			{
				RemoveAudioClip(audioClip, audioComponent, printDebug);
			}
		}

		public static void RemoveAudioClipRange(AudioClip[] audioClips, AudioList audioList, bool printDebug = false)
		{
			if (audioClips == null || audioClips.Length == 0 || (Object)(object)audioList == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"RemoveAudioClipRange() was called with a null AudioClip array, an AudioClip array with no AudioClips, or a null AudioList, please specify which AudioClips to remove from which AudioList, returning");
				return;
			}
			foreach (AudioClip audioClip in audioClips)
			{
				RemoveAudioClip(audioClip, audioList, printDebug);
			}
		}

		public static void RemoveDuplicates(GameObject objectToRemoveFrom, bool printDebug = false, bool removeDuplicateAudioClipsWithDifferentWeight = true)
		{
			RemoveDuplicates(GetSharedAudioComponent(objectToRemoveFrom, printDebug), printDebug, removeDuplicateAudioClipsWithDifferentWeight);
		}

		public static void RemoveDuplicates(SharedAudioComponent audioComponent, bool printDebug = false, bool removeDuplicateAudioClipsWithDifferentWeight = true)
		{
			if ((Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"RemoveDuplicates() was called with a null SharedAudioComponent, please specify what SharedAudioComponent to remove duplicates from, returning");
				return;
			}
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)$"received call to remove duplicates with removeDuplicateClipsWithDifferentWeight {removeDuplicateAudioClipsWithDifferentWeight} in SharedAudioComponent on object {((Object)((Component)audioComponent).gameObject).name}");
			}
			if (audioComponent.allAudioLists.Count <= 1)
			{
				if (printDebug)
				{
					Plugin.Logger.LogDebug((object)("SharedAudioComponent on object " + ((Object)((Component)audioComponent).gameObject).name + " does not contain enough AudioLists to have any duplicates, returning"));
				}
				return;
			}
			int count = audioComponent.allAudioLists.Count;
			List<AudioList> list = new List<AudioList>();
			for (int i = 0; i < audioComponent.allAudioLists.Count; i++)
			{
				for (int j = 0; j < audioComponent.allAudioLists.Count; j++)
				{
					if (j > i && audioComponent.allAudioLists[i].weightedClipsList.Count == audioComponent.allAudioLists[j].weightedClipsList.Count && DoAudioListsMatch(audioComponent.allAudioLists[i].weightedClipsList, audioComponent.allAudioLists[j].weightedClipsList, removeDuplicateAudioClipsWithDifferentWeight))
					{
						list.Add(audioComponent.allAudioLists[j]);
					}
				}
			}
			if (list.Count > 0)
			{
				foreach (AudioList item in list)
				{
					if (printDebug)
					{
						Plugin.Logger.LogDebug((object)$"removing duplicate AudioList with name '{item}' on object {((Object)((Component)audioComponent).gameObject).name}");
					}
					audioComponent.allAudioLists.Remove(item);
				}
			}
			int count2 = audioComponent.allAudioLists.Count;
			if (count > count2 && printDebug)
			{
				Plugin.Logger.LogDebug((object)$"removed {count - count2} duplicates in SharedAudioComponent on object {((Object)((Component)audioComponent).gameObject).name}");
			}
		}

		public static void RemoveDuplicates(AudioList audioList, bool printDebug = false, bool removeDuplicateAudioClipsWithDifferentWeight = true)
		{
			if ((Object)(object)audioList == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"RemoveDuplicates() was called with a null AudioList, please specify what AudioList to remove duplicates from, returning");
				return;
			}
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)$"received call to remove duplicates with removeDuplicateClipsWithDifferentWeight {removeDuplicateAudioClipsWithDifferentWeight} in AudioList with name '{((Object)audioList).name}'");
			}
			if (audioList.weightedClipsList.Count <= 1)
			{
				if (printDebug)
				{
					Plugin.Logger.LogDebug((object)("AudioList with name '" + ((Object)audioList).name + "' does not contain enough AudioClipsWithWeight to have any duplicates, returning"));
				}
				return;
			}
			int count = audioList.weightedClipsList.Count;
			List<AudioClipWithWeight> list = new List<AudioClipWithWeight>();
			for (int i = 0; i < audioList.weightedClipsList.Count; i++)
			{
				for (int j = 0; j < audioList.weightedClipsList.Count; j++)
				{
					if (j > i && ((removeDuplicateAudioClipsWithDifferentWeight && (Object)(object)audioList.weightedClipsList[i].audioClip == (Object)(object)audioList.weightedClipsList[j].audioClip) || (!removeDuplicateAudioClipsWithDifferentWeight && (Object)(object)audioList.weightedClipsList[i].audioClip == (Object)(object)audioList.weightedClipsList[j].audioClip && audioList.weightedClipsList[i].weight == audioList.weightedClipsList[j].weight)))
					{
						list.Add(audioList.weightedClipsList[j]);
					}
				}
			}
			if (list.Count > 0)
			{
				foreach (AudioClipWithWeight item in list)
				{
					if (printDebug)
					{
						Plugin.Logger.LogDebug((object)$"removing duplicate AudioClip with name '{item}' on AudioList with name '{((Object)audioList).name}'");
					}
					audioList.weightedClipsList.Remove(item);
				}
			}
			int count2 = audioList.weightedClipsList.Count;
			if (count > count2 && printDebug)
			{
				Plugin.Logger.LogDebug((object)$"removed {count - count2} duplicates in AudioList with name '{((Object)audioList).name}'");
			}
		}

		public static void RemoveNull(GameObject objectToRemoveFrom, AudioList audioList, bool printDebug = false, bool removeNullAudioClips = true, bool removeEmptyAudioLists = true)
		{
			RemoveNull(GetSharedAudioComponent(objectToRemoveFrom, printDebug), printDebug, AudioListGetIndex(audioList, GetSharedAudioComponent(objectToRemoveFrom, printDebug), printDebug), removeNullAudioClips, removeEmptyAudioLists);
		}

		public static void RemoveNull(SharedAudioComponent audioComponent, AudioList audioList, bool printDebug = false, bool removeNullAudioClips = true, bool removeEmptyAudioLists = true)
		{
			RemoveNull(audioComponent, printDebug, AudioListGetIndex(audioList, audioComponent, printDebug), removeNullAudioClips, removeEmptyAudioLists);
		}

		public static void RemoveNull(GameObject objectToRemoveFrom, bool printDebug = false, int indexListToClear = -1, bool removeNullAudioClips = true, bool removeEmptyAudioLists = true)
		{
			RemoveNull(GetSharedAudioComponent(objectToRemoveFrom, printDebug), printDebug, indexListToClear, removeNullAudioClips, removeEmptyAudioLists);
		}

		public static void RemoveNull(SharedAudioComponent audioComponent, bool printDebug = false, int indexListToClear = -1, bool removeNullAudioClips = true, bool removeEmptyAudioLists = true)
		{
			if ((Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"RemoveNull() was called with a null SharedAudioComponent, please specify what SharedAudioComponent to remove null from, returning");
				return;
			}
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)$"received call to removeNull {removeNullAudioClips} and removeEmpty {removeEmptyAudioLists} in SharedAudioComponent on object {((Object)((Component)audioComponent).gameObject).name} at index [{indexListToClear}]");
			}
			List<AudioList> list = new List<AudioList>();
			if (indexListToClear < 0)
			{
				foreach (AudioList allAudioList in audioComponent.allAudioLists)
				{
					int num = 0;
					if (removeNullAudioClips)
					{
						num = GoThroughListToRemoveNull(allAudioList);
					}
					if (num != 0 && printDebug)
					{
						Plugin.Logger.LogDebug((object)$"removed {num} null in AudioList with name '{((Object)allAudioList).name}' on object {((Object)((Component)audioComponent).gameObject).name}");
					}
					if (allAudioList.weightedClipsList.Count == 0 && removeEmptyAudioLists)
					{
						if (printDebug)
						{
							Plugin.Logger.LogDebug((object)("AudioList with name '" + ((Object)allAudioList).name + "' on object " + ((Object)audioComponent).name + " did not have any audioClips, removing AudioList from allAudioLists"));
						}
						list.Add(allAudioList);
					}
				}
			}
			else
			{
				int num2 = 0;
				if (removeNullAudioClips)
				{
					num2 = GoThroughListToRemoveNull(audioComponent.allAudioLists[indexListToClear]);
				}
				if (num2 != 0 && printDebug)
				{
					Plugin.Logger.LogDebug((object)$"removed {num2} null in AudioList with name '{((Object)audioComponent.allAudioLists[indexListToClear]).name}' on object {((Object)((Component)audioComponent).gameObject).name}");
				}
				if (audioComponent.allAudioLists[indexListToClear].weightedClipsList.Count == 0 && removeEmptyAudioLists)
				{
					if (printDebug)
					{
						Plugin.Logger.LogDebug((object)("AudioList with name '" + ((Object)audioComponent.allAudioLists[indexListToClear]).name + "' on object " + ((Object)audioComponent).name + " did not have any audioClips, removing AudioList from allAudioLists"));
					}
					list.Add(audioComponent.allAudioLists[indexListToClear]);
				}
			}
			if (list.Count <= 0)
			{
				return;
			}
			foreach (AudioList item in list)
			{
				audioComponent.allAudioLists.Remove(item);
			}
		}

		public static void RemoveLoadType(GameObject objectToRemoveFrom, AudioClipLoadType loadType, AudioList audioList, bool printDebug = false)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			RemoveLoadType(GetSharedAudioComponent(objectToRemoveFrom, printDebug), loadType, printDebug, AudioListGetIndex(audioList, GetSharedAudioComponent(objectToRemoveFrom, printDebug), printDebug));
		}

		public static void RemoveLoadType(SharedAudioComponent audioComponent, AudioClipLoadType loadType, AudioList audioList, bool printDebug = false)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			RemoveLoadType(audioComponent, loadType, printDebug, AudioListGetIndex(audioList, audioComponent, printDebug));
		}

		public static void RemoveLoadType(GameObject objectToRemoveFrom, AudioClipLoadType loadType, bool printDebug = false, int indexListToClear = -1)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			RemoveLoadType(GetSharedAudioComponent(objectToRemoveFrom, printDebug), loadType, printDebug, indexListToClear);
		}

		public static void RemoveLoadType(SharedAudioComponent audioComponent, AudioClipLoadType loadType, bool printDebug = false, int indexListToClear = -1)
		{
			//IL_0031: 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_0131: 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_00ab: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"RemoveLoadType() was called with a null SharedAudioComponent, please specify what SharedAudioComponent to remove AudioClipLoadTypes from, returning");
				return;
			}
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)$"received call to remove AudioClipLoadType {loadType} in SharedAudioComponent on object {((Object)((Component)audioComponent).gameObject).name} at index [{indexListToClear}]");
			}
			if (indexListToClear < 0)
			{
				foreach (AudioList allAudioList in audioComponent.allAudioLists)
				{
					int num = GoThroughListToRemoveLoadTypes(allAudioList, loadType);
					if (num != 0 && printDebug)
					{
						Plugin.Logger.LogDebug((object)$"removed {num} AudioClips with AudioClipLoadType {loadType} in AudioList with name '{((Object)allAudioList).name}' on object {((Object)((Component)audioComponent).gameObject).name}");
					}
				}
				return;
			}
			int num2 = GoThroughListToRemoveLoadTypes(audioComponent.allAudioLists[indexListToClear], loadType);
			if (num2 != 0 && printDebug)
			{
				Plugin.Logger.LogDebug((object)$"removed {num2} AudioClips with AudioClipLoadType {loadType} in AudioList with name '{((Object)audioComponent.allAudioLists[indexListToClear]).name}' on object {((Object)((Component)audioComponent).gameObject).name}");
			}
		}

		public static AudioClip AudioClipAddNew(AudioClip newAudioClip, GameObject objectToAdd, bool printDebug = false, int audioClipWeight = 100, bool allowDuplicates = false)
		{
			return AudioClipAddNew(newAudioClip, AudioListGetDefault(GetSharedAudioComponent(objectToAdd, printDebug), printDebug), printDebug, audioClipWeight, allowDuplicates);
		}

		public static AudioClip AudioClipAddNew(AudioClip newAudioClip, SharedAudioComponent audioComponent, bool printDebug = false, int audioClipWeight = 100, bool allowDuplicates = false)
		{
			return AudioClipAddNew(newAudioClip, AudioListGetDefault(audioComponent), printDebug, audioClipWeight, allowDuplicates);
		}

		public static AudioClip AudioClipAddNew(AudioClip newAudioClip, AudioList audioList, bool printDebug = false, int audioClipWeight = 100, bool allowDuplicates = false)
		{
			if ((Object)(object)newAudioClip == (Object)null || (Object)(object)audioList == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioClipAddNew() was called with a null AudioClip and/or AudioList, please specify what AudioClip to add to what AudioList");
				return null;
			}
			if (!allowDuplicates)
			{
				foreach (AudioClipWithWeight weightedClips in audioList.weightedClipsList)
				{
					if ((Object)(object)weightedClips.audioClip == (Object)(object)newAudioClip && weightedClips.weight == audioClipWeight)
					{
						if (printDebug)
						{
							Plugin.Logger.LogDebug((object)$"AudioList with name '{((Object)audioList).name}' already contained an AudioClipWithWeight with name and weight '{((Object)newAudioClip).name} // {audioClipWeight}', skipping adding a duplicate instance");
						}
						return null;
					}
				}
			}
			AudioClipWithWeight audioClipWithWeight = ScriptableObject.CreateInstance<AudioClipWithWeight>();
			audioClipWithWeight.audioClip = newAudioClip;
			if (audioClipWeight <= 0)
			{
				audioClipWithWeight.weight = 100;
				Plugin.Logger.LogWarning((object)$"AudioClipAddNew() was called with an invalid audioClipWeight value of {audioClipWeight}, only positive values above zero allowed, adding new AudioClip with weight {audioClipWithWeight.weight}");
			}
			else
			{
				audioClipWithWeight.weight = audioClipWeight;
			}
			((Object)audioClipWithWeight).name = $"{((Object)newAudioClip).name} // {audioClipWithWeight.weight}";
			audioList.weightedClipsList.Add(audioClipWithWeight);
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)$"added AudioClipWithWeight with name and weight '{((Object)audioClipWithWeight).name}' to AudioList with name '{((Object)audioList).name}' at index [{audioList.weightedClipsList.Count - 1}]");
			}
			return newAudioClip;
		}

		public static AudioClip[] AudioClipAddNewRange(AudioClip[] audioClips, GameObject objectToAdd, bool printDebug = false, int audioClipWeight = 100, bool allowDuplicates = false)
		{
			return AudioClipAddNewRange(audioClips, AudioListGetDefault(GetSharedAudioComponent(objectToAdd, printDebug), printDebug), printDebug, audioClipWeight, allowDuplicates);
		}

		public static AudioClip[] AudioClipAddNewRange(AudioClip[] audioClips, SharedAudioComponent audioComponent, bool printDebug = false, int audioClipWeight = 100, bool allowDuplicates = false)
		{
			return AudioClipAddNewRange(audioClips, AudioListGetDefault(audioComponent, printDebug), printDebug, audioClipWeight, allowDuplicates);
		}

		public static AudioClip[] AudioClipAddNewRange(AudioClip[] audioClips, AudioList audioList, bool printDebug = false, int audioClipWeight = 100, bool allowDuplicates = false)
		{
			if (audioClips == null || (Object)(object)audioList == (Object)null || audioClips.Length == 0)
			{
				Plugin.Logger.LogWarning((object)"AudioClipAddNewRange() was called with either a null AudioClip array, an empty AudioClip array, or a null AudioList, please provide a valid AudioClip array and what AudioList to add it to");
				return audioClips;
			}
			foreach (AudioClip newAudioClip in audioClips)
			{
				AudioClipAddNew(newAudioClip, audioList, printDebug, audioClipWeight, allowDuplicates);
			}
			return audioClips;
		}

		public static AudioClip[] AudioClipAddNewRangeCapped(AudioClip[] audioClips, GameObject objectToAdd, bool printDebug = false, int amountToAdd = 0, int audioClipWeight = 100, bool randomize = false, bool allowDuplicates = false)
		{
			return AudioClipAddNewRangeCapped(audioClips, AudioListGetDefault(GetSharedAudioComponent(objectToAdd, printDebug), printDebug), printDebug, amountToAdd, audioClipWeight, randomize, allowDuplicates);
		}

		public static AudioClip[] AudioClipAddNewRangeCapped(AudioClip[] audioClips, SharedAudioComponent audioComponent, bool printDebug = false, int amountToAdd = 0, int audioClipWeight = 100, bool randomize = false, bool allowDuplicates = false)
		{
			return AudioClipAddNewRangeCapped(audioClips, AudioListGetDefault(audioComponent, printDebug), printDebug, amountToAdd, audioClipWeight, randomize, allowDuplicates);
		}

		public static AudioClip[] AudioClipAddNewRangeCapped(AudioClip[] audioClips, AudioList audioList, bool printDebug = false, int amountToAdd = 0, int audioClipWeight = 100, bool randomize = false, bool allowDuplicates = false)
		{
			if (audioClips == null || (Object)(object)audioList == (Object)null || audioClips.Length == 0)
			{
				Plugin.Logger.LogWarning((object)"AudioClipAddNewRangeCapped() was called with either a null AudioClip array, an empty AudioClip array, or a null AudioList, please provide a valid AudioClip array and what AudioList to add it to");
				return audioClips;
			}
			if (amountToAdd > audioClips.Length)
			{
				Plugin.Logger.LogWarning((object)"AudioClipAddNewRangeCapped() was called with an amountToAdd larger than the length of the AudioClips array, adding all AudioClips in the given array");
				amountToAdd = audioClips.Length;
			}
			else if (amountToAdd <= 0)
			{
				Plugin.Logger.LogWarning((object)"AudioClipAddNewRangeCapped() was called with an amountToAdd smaller than one, getting a new random amountToAdd");
				amountToAdd = Random.Range(0, audioClips.Length);
			}
			List<AudioClip> list = new List<AudioClip>();
			if (randomize)
			{
				List<int> list2 = new List<int>();
				for (int i = 0; i < audioClips.Length; i++)
				{
					list2.Add(i);
				}
				for (int j = 0; j < amountToAdd; j++)
				{
					int index = Random.Range(0, list2.Count);
					list.Add(AudioClipAddNew(audioClips[list2[index]], audioList, printDebug, audioClipWeight, allowDuplicates));
					list2.RemoveAt(index);
				}
			}
			else
			{
				for (int k = 0; k < amountToAdd; k++)
				{
					list.Add(AudioClipAddNew(audioClips[k], audioList, printDebug, audioClipWeight, allowDuplicates));
				}
			}
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)$"added random range of AudioClips with a length of {list.Count} to AudioList with name '{((Object)audioList).name}' with a randomize value of {randomize}");
			}
			return list.ToArray();
		}

		public static AudioClip AudioClipGetByName(string nameClipToSearch, GameObject objectToCheck, bool printDebug = false)
		{
			return AudioClipGetByName(nameClipToSearch, GetSharedAudioComponent(objectToCheck, printDebug), printDebug);
		}

		public static AudioClip AudioClipGetByName(string nameClipToSearch, SharedAudioComponent audioComponent, bool printDebug = false)
		{
			if (nameClipToSearch == null || (Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioClipGetByNameFromAnyList() was called with a null nameClipToSearch and/or AudioComponent, please specify what name to search for on what SharedAudioComponent, returning null");
				return null;
			}
			if (audioComponent.allAudioLists.Count == 0)
			{
				Plugin.Logger.LogWarning((object)("SharedAudioComponent on object '" + ((Object)((Component)audioComponent).gameObject).name + "' did not contain any AudioLists, returning null"));
				return null;
			}
			for (int i = 0; i < audioComponent.allAudioLists.Count; i++)
			{
				for (int j = 0; j < audioComponent.allAudioLists[i].weightedClipsList.Count; j++)
				{
					if (((Object)audioComponent.allAudioLists[i].weightedClipsList[j].audioClip).name == nameClipToSearch)
					{
						if (printDebug)
						{
							Plugin.Logger.LogDebug((object)$"returned AudioClip with name '{((Object)audioComponent.allAudioLists[i].weightedClipsList[j].audioClip).name}' in AudioList with name '{((Object)audioComponent.allAudioLists[i]).name}' at index [{j}] on object '{((Object)((Component)audioComponent).gameObject).name}'");
						}
						return audioComponent.allAudioLists[i].weightedClipsList[j].audioClip;
					}
				}
			}
			Plugin.Logger.LogWarning((object)("no AudioClip with name '" + nameClipToSearch + "' was found on object " + ((Object)((Component)audioComponent).gameObject).name + ", returning null"));
			return null;
		}

		public static AudioClip AudioClipGetByName(string nameClipToSearch, AudioList audioList, bool printDebug = false)
		{
			if (nameClipToSearch == null || (Object)(object)audioList == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioClipGetByname() was called with a null nameClipToSearch and/or AudioList, please specify what name to search for in what AudioList, returning null");
				return null;
			}
			if (audioList.weightedClipsList.Count == 0)
			{
				Plugin.Logger.LogWarning((object)("AudioList with name '" + ((Object)audioList).name + "' did not contain any AudioClips, returning null"));
				return null;
			}
			for (int i = 0; i < audioList.weightedClipsList.Count; i++)
			{
				if (((Object)audioList.weightedClipsList[i].audioClip).name == nameClipToSearch)
				{
					if (printDebug)
					{
						Plugin.Logger.LogDebug((object)("returned AudioClip with name '" + ((Object)audioList.weightedClipsList[i].audioClip).name + "' in AudioList with name '" + ((Object)audioList).name + "'"));
					}
					return audioList.weightedClipsList[i].audioClip;
				}
			}
			Plugin.Logger.LogWarning((object)("no AudioClip with name '" + nameClipToSearch + "' was found in AudioList with name '" + ((Object)audioList).name + "', returning null"));
			return null;
		}

		public static AudioClip AudioClipGetNextInAudioList(AudioClip audioClip, GameObject objectToCheck, bool printDebug = false)
		{
			return AudioClipGetNextInAudioList(audioClip, GetSharedAudioComponent(objectToCheck, printDebug), printDebug);
		}

		public static AudioClip AudioClipGetNextInAudioList(AudioClip audioClip, SharedAudioComponent audioComponent, bool printDebug = false)
		{
			return AudioClipGetNextInAudioList(audioClip, AudioClipGetAudioList(audioClip, audioComponent, printDebug), printDebug);
		}

		public static AudioClip AudioClipGetNextInAudioList(AudioClip audioClip, AudioList audioList, bool printDebug = false)
		{
			if ((Object)(object)audioList == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioClipGetNextInAudioList() was called with a null AudioList, please specify what AudioList to get a next AudioClip from, returning null");
				return null;
			}
			if (audioList.weightedClipsList.Count == 0)
			{
				Plugin.Logger.LogWarning((object)("AudioList with name '" + ((Object)audioList).name + "' did not contain any AudioClips, returning null"));
				return null;
			}
			if ((Object)(object)audioClip == (Object)null)
			{
				if (printDebug)
				{
					Plugin.Logger.LogDebug((object)("AudioClip given to GetAudioClipNextInAudioList() was null, returning first song in AudioList with name '" + ((Object)audioList).name + "'"));
				}
				return audioList.weightedClipsList[0].audioClip;
			}
			int num = -1;
			for (int i = 0; i < audioList.weightedClipsList.Count; i++)
			{
				if ((Object)(object)audioList.weightedClipsList[i].audioClip == (Object)(object)audioClip)
				{
					num = i;
					break;
				}
			}
			int num2 = num + 1;
			if (num2 == audioList.weightedClipsList.Count)
			{
				num2 = 0;
			}
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)$"returned next AudioClip with name '{((Object)audioList.weightedClipsList[num2].audioClip).name}' in AudioList with name '{((Object)audioList).name}' at index [{num2}]");
			}
			return audioList.weightedClipsList[num2].audioClip;
		}

		public static AudioClip AudioClipGetRandom(GameObject objectToCheck, bool printDebug = false)
		{
			return AudioClipGetRandom(AudioListGetRandom(GetSharedAudioComponent(objectToCheck, printDebug), printDebug), printDebug);
		}

		public static AudioClip AudioClipGetRandom(SharedAudioComponent audioComponent, bool printDebug = false)
		{
			return AudioClipGetRandom(AudioListGetRandom(audioComponent, printDebug), printDebug);
		}

		public static AudioClip AudioClipGetRandom(AudioList audioList, bool printDebug = false)
		{
			if ((Object)(object)audioList == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioClipGetRandom() was called with a null AudioList, please specify what AudioList to get a random AudioClip from, returning null");
				return null;
			}
			if (audioList.weightedClipsList.Count == 0)
			{
				Plugin.Logger.LogWarning((object)("AudioList with name '" + ((Object)audioList).name + "' did not contain any AudioClips, returning null"));
				return null;
			}
			int num = Random.Range(0, audioList.weightedClipsList.Count);
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)$"returned random AudioClip with name '{((Object)audioList.weightedClipsList[num].audioClip).name}' in AudioList with name '{((Object)audioList).name}' at index [{num}]");
			}
			return audioList.weightedClipsList[num].audioClip;
		}

		public static AudioClip AudioClipGetRandomByWeight(GameObject objectToCheck, bool printDebug = false)
		{
			return AudioClipGetRandomByWeight(AudioListGetRandomByWeight(GetSharedAudioComponent(objectToCheck, printDebug), printDebug), printDebug);
		}

		public static AudioClip AudioClipGetRandomByWeight(SharedAudioComponent audioComponent, bool printDebug = false)
		{
			return AudioClipGetRandomByWeight(AudioListGetRandomByWeight(audioComponent, printDebug), printDebug);
		}

		public static AudioClip AudioClipGetRandomByWeight(AudioList audioList, bool printDebug = false)
		{
			if ((Object)(object)audioList == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioClipGetRandomByWeight() was called with a null AudioList, please specify what AudioList to get a random weighted AudioClip from, returning null");
				return null;
			}
			int num = AddUpAllWeights(null, audioList);
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)$"got totalWeight {num} from AudioList with name '{((Object)audioList).name}'");
			}
			int num2 = Random.Range(0, num + 1);
			int num3 = 0;
			int num4 = -1;
			for (int i = 0; i < audioList.weightedClipsList.Count; i++)
			{
				num3 += audioList.weightedClipsList[i].weight;
				if (num2 > num4 && num2 <= num3)
				{
					if (printDebug)
					{
						Plugin.Logger.LogDebug((object)$"returned random AudioClip with name '{((Object)audioList.weightedClipsList[i].audioClip).name}' at index [{i}] on AudioList with name '{((Object)audioList).name}' after getting random weight {num2}");
					}
					return audioList.weightedClipsList[i].audioClip;
				}
			}
			Plugin.Logger.LogWarning((object)$"error occured while looking for random weight {num2} in AudioList with name '{((Object)audioList).name}', returning null");
			return null;
		}

		public static AudioClip[] AudioClipGetAll(GameObject objectToCheck, bool printDebug = false, int indexListToSearch = -1)
		{
			return AudioClipGetAll(GetSharedAudioComponent(objectToCheck, printDebug), printDebug, indexListToSearch);
		}

		public static AudioClip[] AudioClipGetAll(SharedAudioComponent audioComponent, bool printDebug = false, int indexListToSearch = -1)
		{
			HashSet<AudioClip> hashSet = new HashSet<AudioClip>();
			if (indexListToSearch < 0)
			{
				for (int i = 0; i < audioComponent.allAudioLists.Count; i++)
				{
					AudioClip[] array = AudioClipGetAll(audioComponent.allAudioLists[i], printDebug);
					foreach (AudioClip item in array)
					{
						hashSet.Add(item);
					}
				}
			}
			else
			{
				AudioClip[] array2 = AudioClipGetAll(audioComponent.allAudioLists[indexListToSearch], printDebug);
				foreach (AudioClip item2 in array2)
				{
					hashSet.Add(item2);
				}
			}
			if (hashSet.Count > 0)
			{
				if (printDebug)
				{
					Plugin.Logger.LogDebug((object)$"returned array of AudioClips with length {hashSet.Count} from object '{((Object)((Component)audioComponent).gameObject).name}'");
				}
				return hashSet.ToArray();
			}
			Plugin.Logger.LogWarning((object)("no array of AudioClips to return found on object '" + ((Object)((Component)audioComponent).gameObject).name + "', returning null"));
			return null;
		}

		public static AudioClip[] AudioClipGetAll(AudioList audioList, bool printDebug = false)
		{
			HashSet<AudioClip> hashSet = new HashSet<AudioClip>();
			foreach (AudioClipWithWeight weightedClips in audioList.weightedClipsList)
			{
				if ((Object)(object)weightedClips.audioClip != (Object)null)
				{
					hashSet.Add(weightedClips.audioClip);
				}
			}
			if (hashSet.Count > 0)
			{
				if (printDebug)
				{
					Plugin.Logger.LogDebug((object)$"returned array of AudioClips with length {hashSet.Count} from AudioList with name '{((Object)audioList).name}'");
				}
				return hashSet.ToArray();
			}
			Plugin.Logger.LogWarning((object)("no array of AudioClips to return found on AudioList with name '" + ((Object)audioList).name + "', returning null"));
			return null;
		}

		public static int AudioClipGetIndex(AudioClip audioClip, GameObject objectToCheck, bool printDebug = false)
		{
			return AudioClipGetIndex(audioClip, AudioClipGetAudioList(audioClip, objectToCheck), printDebug);
		}

		public static int AudioClipGetIndex(AudioClip audioClip, SharedAudioComponent audioComponent, bool printDebug = false)
		{
			return AudioClipGetIndex(audioClip, AudioClipGetAudioList(audioClip, audioComponent, printDebug), printDebug);
		}

		public static int AudioClipGetIndex(AudioClip audioClip, AudioList audioList, bool printDebug = false)
		{
			if ((Object)(object)audioClip == (Object)null || (Object)(object)audioList == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioClipGetIndex() was called with a null AudioClip and/or AudioList, please specify what AudioClip to get an index from in what AudioList, returning null");
				return 0;
			}
			if (audioList.weightedClipsList.Count == 0)
			{
				Plugin.Logger.LogWarning((object)("AudioList with name '" + ((Object)audioList).name + "' did not contain any AudioClips, returning null"));
				return 0;
			}
			for (int i = 0; i < audioList.weightedClipsList.Count; i++)
			{
				if ((Object)(object)audioList.weightedClipsList[i].audioClip == (Object)(object)audioClip)
				{
					if (printDebug)
					{
						Plugin.Logger.LogDebug((object)$"returned index [{i}] for AudioClip with name '{((Object)audioClip).name}' in AudioList with name '{((Object)audioList).name}'");
					}
					return i;
				}
			}
			Plugin.Logger.LogWarning((object)("no AudioClip with name '" + ((Object)audioClip).name + "' was found in AudioList with name '" + ((Object)audioList).name + "', returning first index in AudioList with name '" + ((Object)audioList).name + "'"));
			return 0;
		}

		public static AudioClipWithWeight AudioClipGetAudioClipWithWeight(AudioClip audioClip, GameObject objectToCheck, bool printDebug = false)
		{
			return AudioClipGetAudioClipWithWeight(audioClip, GetSharedAudioComponent(objectToCheck, printDebug), printDebug);
		}

		public static AudioClipWithWeight AudioClipGetAudioClipWithWeight(AudioClip audioClip, SharedAudioComponent audioComponent, bool printDebug = false)
		{
			if ((Object)(object)audioClip == (Object)null || (Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioClipGetAudioClipWithWeight() was called with a null AudioClip and/or SharedAudioComponent, please specify what AudioClipWithWeight to get its AudioClipWithWeight from what SharedAudioComponent, returning null");
				return null;
			}
			if (audioComponent.allAudioLists.Count == 0)
			{
				Plugin.Logger.LogWarning((object)("SharedAudioComponent on object " + ((Object)((Component)audioComponent).gameObject).name + " does not contain any AudioLists to get AudioClipWithWeights from, returning null"));
				return null;
			}
			AudioClipWithWeight audioClipWithWeight = null;
			foreach (AudioList allAudioList in audioComponent.allAudioLists)
			{
				audioClipWithWeight = AudioClipGetAudioClipWithWeight(audioClip, allAudioList, printDebug);
				if ((Object)(object)audioClipWithWeight != (Object)null)
				{
					break;
				}
			}
			if ((Object)(object)audioClipWithWeight == (Object)null)
			{
				Plugin.Logger.LogWarning((object)("no AudioClipWithWeight was found for AudioClip with name '" + ((Object)audioClip).name + "', returning null"));
			}
			if (printDebug)
			{
				Plugin.Logger.LogDebug((object)("returning AudioClipWithWeight with name '" + ((Object)audioClipWithWeight).name + "'"));
			}
			return audioClipWithWeight;
		}

		public static AudioClipWithWeight AudioClipGetAudioClipWithWeight(AudioClip audioClip, AudioList audioList, bool printDebug = false)
		{
			if ((Object)(object)audioClip == (Object)null || (Object)(object)audioList == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioClipGetAudioClipWithWeight() was called with a null AudioClip and/or AudioList, please specify what AudioClip to get its AudioClipWithWeight from what AudioList, returning null");
				return null;
			}
			if (audioList.weightedClipsList.Count == 0)
			{
				Plugin.Logger.LogWarning((object)("AudioList with name '" + ((Object)audioList).name + "' did not contain any AudioClipWithWeights, returning null"));
				return null;
			}
			for (int i = 0; i < audioList.weightedClipsList.Count; i++)
			{
				if ((Object)(object)audioList.weightedClipsList[i].audioClip == (Object)(object)audioClip)
				{
					if (printDebug)
					{
						Plugin.Logger.LogDebug((object)$"returned AudioClipWithWeight with name '{((Object)audioList.weightedClipsList[i]).name}' from AudioList with name '{((Object)audioList).name}' at index [{i}]");
					}
					return audioList.weightedClipsList[i];
				}
			}
			Plugin.Logger.LogWarning((object)("no AudioClipWithWeight containing AudioClip with name '" + ((Object)audioClip).name + "' was found in AudioList with name " + ((Object)audioList).name + ", returning null"));
			return null;
		}

		public static AudioList AudioClipGetAudioList(AudioClip audioClip, GameObject objectToCheck, bool printDebug = false)
		{
			return AudioClipGetAudioList(audioClip, GetSharedAudioComponent(objectToCheck, printDebug), printDebug);
		}

		public static AudioList AudioClipGetAudioList(AudioClip audioClip, SharedAudioComponent audioComponent, bool printDebug = false)
		{
			if ((Object)(object)audioClip == (Object)null || (Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioClipGetAudioList() was called with a null AudioClip and/or SharedAudioComponent, please specify what AudioClip to get its AudioList from, returning null");
				return null;
			}
			CheckComponentListForNull(audioComponent, printDebug);
			if (audioComponent.allAudioLists.Count == 0)
			{
				Plugin.Logger.LogWarning((object)("SharedAudioComponent on object '" + ((Object)((Component)audioComponent).gameObject).name + "' did not contain any AudioLists, returning null"));
				return null;
			}
			for (int i = 0; i < audioComponent.allAudioLists.Count; i++)
			{
				for (int j = 0; j < audioComponent.allAudioLists[i].weightedClipsList.Count; j++)
				{
					if ((Object)(object)audioComponent.allAudioLists[i].weightedClipsList[j].audioClip == (Object)(object)audioClip)
					{
						if (printDebug)
						{
							Plugin.Logger.LogDebug((object)$"returned AudioList with name '{((Object)audioComponent.allAudioLists[i]).name}' on object '{((Object)((Component)audioComponent).gameObject).name}' at index [{i}]");
						}
						return audioComponent.allAudioLists[i];
					}
				}
			}
			Plugin.Logger.LogWarning((object)("no AudioList containing AudioClip with name '" + ((Object)audioClip).name + "' was found on object " + ((Object)((Component)audioComponent).gameObject).name + ", returning first AudioList on SharedAudioComponent"));
			return audioComponent.allAudioLists[0];
		}

		public static AudioList[] AudioClipGetEveryAudioList(AudioClip audioClip, GameObject objectToCheck, bool printDebug = false)
		{
			return AudioClipGetEveryAudioList(audioClip, GetSharedAudioComponent(objectToCheck, printDebug), printDebug);
		}

		public static AudioList[] AudioClipGetEveryAudioList(AudioClip audioClip, SharedAudioComponent audioComponent, bool printDebug = false)
		{
			if ((Object)(object)audioClip == (Object)null || (Object)(object)audioComponent == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AudioClipGetEveryAudioList() was called with a null AudioClip and/or SharedAudioComponent, please specify what AudioClip to get all AudioLists from, returning null");
				return null;
			}
			CheckComponentListForNull(audioComponent, printDebug);
			if (audioComponent.allAudioLists.Count == 0)
			{
				Plugin.Logger.LogWarning((object)("SharedAudioComponent on object '" + ((Object)((Component)audioComponent).gameObject).name + "' did not contain any AudioLists, returning null"));
				return null;
			}
			HashSet<AudioList> hashSet = new HashSet<AudioList>();
			for (int i = 0; i < audioComponent.allAudioLists.Count; i++)
			{
				for (int j = 0; j < audioComponent.allAudioLists[i].weightedClipsList.Count; j++)
				{
					if ((Object)(object)audioComponent.allAudioLists[i].weightedClipsList[j].audioClip == (Object)(object)audioClip)
					{
						if (printDebug)
						{
							Plugin.Logger.LogDebug((object)$"found AudioClip with name '{((Object)audioComponent.allAudioLists[i].weightedClipsList[j].audioClip).name}' in AudioList with name '{((Object)audioComponent.allAudioLists[i]).name}' at index [{i}] on object '{((Object)((Component)audioComponent).gameObject).name}'");
						}
						hashSet.Add(audioComponent.allAudioLists[i]);
					}
				}
			}
			if (hashSet.Count > 0)
			{
				if (printDebug)
				{
					Plugin.Logger.LogDebug((object)$"returning array of AudioLists containing AudioClip with name '{((Object)audioClip).name}' on object {((Object)((Component)audioComponent).gameObject).name} with length {hashSet.Count}");
				}
				return hashSet.ToArray();
			}
			Plugin.Logger.LogWarning((object)("no AudioLists containing AudioClip with name '" + ((Object)audioClip).name + "' were found on object " + ((Object)((Component)audioComponent).gameObject).name + ", returning allAudioLists on SharedAudioComponent"));
			return audioComponent.allAudioLists.ToArray();
		}

		private static bool DoAudioListsMatch(List<AudioClipWithWeight> iList, List<AudioClipWithWeight> jList, bool removeDuplicateClipsWithDifferentWeight)
		{
			int num = 0;
			foreach (AudioClipWithWeight i in iList)
			{
				foreach (AudioClipWithWeight j in jList)
				{
					if (removeDuplicateClipsWithDifferentWeight && (Object)(object)i.audioClip == (Object)(object)j.audioClip)
					{
						num++;
						break;
					}
					if (!removeDuplicateClipsWithDifferentWeight && (Object)(object)i.audioClip == (Object)(object)j.audioClip && i.weight == j.weight)
					{
						num++;
						break;
					}
				}
			}
			if (num >= iList.Count)
			{
				return true;
			}
			return false;
		}

		private static int GoThroughListToRemoveNull(AudioList list)
		{
			int num = 0;
			for (int num2 = list.weightedClipsList.Count - 1; num2 > -1; num2--)
			{
				if ((Object)(object)list.weightedClipsList[num2] == (Object)null || (Object)(object)list.weightedClipsList[num2].audioClip == (Object)null)
				{
					list.weightedClipsList.RemoveAt(num2);
					num++;
				}
			}
			return num;
		}

		private static int GoThroughListToRemoveLoadTypes(AudioList list, AudioClipLoadType clipLoadType)
		{
			//IL_0025: 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)
			int num = 0;
			for (int num2 = list.weightedClipsList.Count - 1; num2 > -1; num2--)
			{
				if (list.weightedClipsList[num2].audioClip.loadType == clipLoadType)
				{
					list.weightedClipsList.RemoveAt(num2);
					num++;
				}
			}
			return num;
		}

		private static void CheckComponentListForNull(SharedAudioComponent aComponent, bool printDebug = false, bool createListIfNull = true, string newListName = null, int newListWeight = 100)
		{
			if (aComponent.allAudioLists.Count == 0)
			{
				if (createListIfNull)
				{
					AudioListCreateNew(aComponent, printDebug, newListName, newListWeight);
				}
				else
				{
					Plugin.Logger.LogWarning((object)("SharedAudioComponent on " + ((Object)((Component)aComponent).gameObject).name + " does not have any AudioLists and createListIfNull is false"));
				}
			}
		}

		private static bool IsListNameUnique(SharedAudioComponent aComponent, string listName)
		{
			foreach (AudioList allAudioList in aComponent.allAudioLists)
			{
				if (((Object)allAudioList).name == listName)
				{
					return false;
				}
			}
			return true;
		}

		private static int AddUpAllWeights(SharedAudioComponent aComponent, AudioList aList = null)
		{
			if ((Object)(object)aComponent == (Object)null && (Object)(object)aList == (Object)null)
			{
				Plugin.Logger.LogWarning((object)"AddUpAllWeights called with no component or list, returning zero");
				return 0;
			}
			int num = 0;
			if ((Object)(object)aComponent != (Object)null)
			{
				foreach (AudioList allAudioList in aComponent.allAudioLists)
				{
					num += allAudioList.listWeight;
				}
				return num;
			}
			foreach (AudioClipWithWeight weightedClips in aList.weightedClipsList)
			{
				num += weightedClips.weight;
			}
			return num;
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "STSharedAudioLib";

		public const string PLUGIN_NAME = "STSharedAudioLib";

		public const string PLUGIN_VERSION = "0.0.2";
	}
}