Decompiled source of Instruments4Music v2.1.0

Instruments4Music.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using Instruments4Music.NetcodePatcher;
using LethalCompanyInputUtils.Api;
using Microsoft.CodeAnalysis;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Utilities;
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("Unity.Netcode.Runtime")]
[assembly: AssemblyCompany("Instruments4Music")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Add instruments to play music.")]
[assembly: AssemblyFileVersion("0.5.0.0")]
[assembly: AssemblyInformationalVersion("0.5.0+1db909e8ff82555010a3cb2aad7ba8ddc2e5ae7c")]
[assembly: AssemblyProduct("Instruments4Music")]
[assembly: AssemblyTitle("Instruments4Music")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.5.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
[module: NetcodePatchedAssembly]
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.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 Instruments4Music
{
	public class InputActions : LcInputActions
	{
		[InputAction("<Keyboard>/backslash", Name = "SwitchTuneMethod", ActionId = "SwitchTuneMethod")]
		public InputAction? SwitchTuneMethod { get; set; }

		[InputAction("<Keyboard>/backspace", Name = "Showtime!", ActionId = "Showtime", KbmInteractions = "hold(duration = 1)")]
		public InputAction? Showtime { get; set; }

		[InputAction("<Keyboard>/escape", Name = "Curtain Call", ActionId = "CurtainCall")]
		public InputAction? CurtainCall { get; set; }

		[InputAction("<Keyboard>/leftShift", Name = "Semitone", ActionId = "Semitone")]
		public InputAction? Semitone { get; set; }

		[InputAction("<Keyboard>/space", Name = "Sustain", ActionId = "Sustain")]
		public InputAction? Sustain { get; set; }

		[InputAction("<Keyboard>/leftCtrl", Name = "Soft", ActionId = "Soft")]
		public InputAction? Soft { get; set; }

		[InputAction("<Keyboard>/tab", Name = "Change Mode", ActionId = "ChangeMode")]
		public InputAction? ChangeMode { get; set; }

		[InputAction("<Keyboard>/enter", Name = "Input Note", ActionId = "InputNote")]
		public InputAction? InputNote { get; set; }

		[InputAction("<Keyboard>/q", Name = "High C", ActionId = "HighC")]
		public InputAction? HighCKey { get; set; }

		[InputAction("<Keyboard>/w", Name = "High D", ActionId = "HighD")]
		public InputAction? HighDKey { get; set; }

		[InputAction("<Keyboard>/e", Name = "High E", ActionId = "HighE")]
		public InputAction? HighEKey { get; set; }

		[InputAction("<Keyboard>/r", Name = "High F", ActionId = "HighF")]
		public InputAction? HighFKey { get; set; }

		[InputAction("<Keyboard>/t", Name = "High G", ActionId = "HighG")]
		public InputAction? HighGKey { get; set; }

		[InputAction("<Keyboard>/y", Name = "High A", ActionId = "HighA")]
		public InputAction? HighAKey { get; set; }

		[InputAction("<Keyboard>/u", Name = "High B", ActionId = "HighB")]
		public InputAction? HighBKey { get; set; }

		[InputAction("<Keyboard>/a", Name = "Mid C", ActionId = "MidC")]
		public InputAction? MidCKey { get; set; }

		[InputAction("<Keyboard>/s", Name = "Mid D", ActionId = "MidD")]
		public InputAction? MidDKey { get; set; }

		[InputAction("<Keyboard>/d", Name = "Mid E", ActionId = "MidE")]
		public InputAction? MidEKey { get; set; }

		[InputAction("<Keyboard>/f", Name = "Mid F", ActionId = "MidF")]
		public InputAction? MidFKey { get; set; }

		[InputAction("<Keyboard>/g", Name = "Mid G", ActionId = "MidG")]
		public InputAction? MidGKey { get; set; }

		[InputAction("<Keyboard>/h", Name = "Mid A", ActionId = "MidA")]
		public InputAction? MidAKey { get; set; }

		[InputAction("<Keyboard>/j", Name = "Mid B", ActionId = "MidB")]
		public InputAction? MidBKey { get; set; }

		[InputAction("<Keyboard>/z", Name = "Low C", ActionId = "LowC")]
		public InputAction? LowCKey { get; set; }

		[InputAction("<Keyboard>/x", Name = "Low D", ActionId = "LowD")]
		public InputAction? LowDKey { get; set; }

		[InputAction("<Keyboard>/c", Name = "Low E", ActionId = "LowE")]
		public InputAction? LowEKey { get; set; }

		[InputAction("<Keyboard>/v", Name = "Low F", ActionId = "LowF")]
		public InputAction? LowFKey { get; set; }

		[InputAction("<Keyboard>/b", Name = "Low G", ActionId = "LowG")]
		public InputAction? LowGKey { get; set; }

		[InputAction("<Keyboard>/n", Name = "Low A", ActionId = "LowA")]
		public InputAction? LowAKey { get; set; }

		[InputAction("<Keyboard>/m", Name = "Low B", ActionId = "LowB")]
		public InputAction? LowBKey { get; set; }

		[InputAction("<Keyboard>/y", Name = "Low C2", ActionId = "LowC2")]
		public InputAction? LowCKey2 { get; set; }

		[InputAction("<Keyboard>/u", Name = "Low D2", ActionId = "LowD2")]
		public InputAction? LowDKey2 { get; set; }

		[InputAction("<Keyboard>/i", Name = "Low E2", ActionId = "LowE2")]
		public InputAction? LowEKey2 { get; set; }

		[InputAction("<Keyboard>/o", Name = "Low F2", ActionId = "LowF2")]
		public InputAction? LowFKey2 { get; set; }

		[InputAction("<Keyboard>/p", Name = "Low G2", ActionId = "LowG2")]
		public InputAction? LowGKey2 { get; set; }

		[InputAction("<Keyboard>/h", Name = "Low A2", ActionId = "LowA2")]
		public InputAction? LowAKey2 { get; set; }

		[InputAction("<Keyboard>/j", Name = "Low B2", ActionId = "LowB2")]
		public InputAction? LowBKey2 { get; set; }

		[InputAction("<Keyboard>/k", Name = "Mid C2", ActionId = "MidC2")]
		public InputAction? MidCKey2 { get; set; }

		[InputAction("<Keyboard>/l", Name = "Mid D2", ActionId = "MidD2")]
		public InputAction? MidDKey2 { get; set; }

		[InputAction("<Keyboard>/semicolon", Name = "Mid E2", ActionId = "MidE2")]
		public InputAction? MidEKey2 { get; set; }

		[InputAction("<Keyboard>/n", Name = "Mid F2", ActionId = "MidF2")]
		public InputAction? MidFKey2 { get; set; }

		[InputAction("<Keyboard>/m", Name = "Mid G2", ActionId = "MidG2")]
		public InputAction? MidGKey2 { get; set; }

		[InputAction("<Keyboard>/comma", Name = "Mid A2", ActionId = "MidA2")]
		public InputAction? MidAKey2 { get; set; }

		[InputAction("<Keyboard>/period", Name = "Mid B2", ActionId = "MidB2")]
		public InputAction? MidBKey2 { get; set; }

		[InputAction("<Keyboard>/slash", Name = "High C2", ActionId = "HighC2")]
		public InputAction? HighCKey2 { get; set; }

		public static string GetButtonDescription(InputAction action)
		{
			//IL_0016: 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_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_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_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: 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)
			bool localPlayerUsingController = StartOfRound.Instance.localPlayerUsingController;
			InputBinding? val = null;
			Enumerator<InputBinding> enumerator = action.bindings.GetEnumerator();
			try
			{
				if (enumerator.MoveNext())
				{
					InputBinding current = enumerator.Current;
					if (localPlayerUsingController || (!((InputBinding)(ref current)).effectivePath.StartsWith("<Keyboard>") && !((InputBinding)(ref current)).effectivePath.StartsWith("<Mouse>")))
					{
						return "";
					}
					val = current;
				}
			}
			finally
			{
				((IDisposable)enumerator).Dispose();
			}
			object obj;
			if (!val.HasValue)
			{
				obj = "";
			}
			else
			{
				InputBinding value = val.Value;
				obj = ((InputBinding)(ref value)).effectivePath;
			}
			string text = (string)obj;
			string[] array = text.Split("/");
			string text2 = ((array.Length > 1) ? text : "");
			if (1 == 0)
			{
			}
			string result;
			switch (text2)
			{
			case "<Mouse>/leftButton":
				result = "LΜB";
				break;
			case "<Mouse>/rightButton":
				result = "RΜB";
				break;
			case "<Keyboard>/escape":
				result = "ESC";
				break;
			case "<Keyboard>/semicolon":
				result = ";";
				break;
			case "<Keyboard>/comma":
				result = ",";
				break;
			case "<Keyboard>/period":
				result = ".";
				break;
			case "<Keyboard>/slash":
				result = "/";
				break;
			default:
			{
				object obj2;
				if (array.Length <= 1)
				{
					obj2 = "?";
				}
				else
				{
					string text3 = array[1].Substring(0, 1).ToUpper();
					string text4 = array[1];
					obj2 = text3 + text4.Substring(1, text4.Length - 1);
				}
				result = (string)obj2;
				break;
			}
			}
			if (1 == 0)
			{
			}
			return result;
		}
	}
	[BepInPlugin("com.bean.Instruments4Music", "Instruments4Music", "2.1.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInProcess("Lethal Company.exe")]
	public class Instruments4MusicPlugin : BaseUnityPlugin
	{
		public static Instruments4MusicPlugin? Instance;

		internal static ManualLogSource? logger;

		public static ConfigFile? config;

		internal static InputActions InputActionsInstance = new InputActions();

		public static GameObject? HudPrefab;

		public static GameObject? HudInstance;

		public static HUDManager? HudManager;

		public static HUDElement? HudElement;

		public static AudioMixer? TuneMixer;

		public static StationaryScript? Stationary;

		public static PortableScript? Portable;

		public static TuneAudioScript? Tune;

		public static PlayerControllerB Player => GameNetworkManager.Instance.localPlayerController;

		public static void AddLog(string str)
		{
			ManualLogSource? obj = logger;
			if (obj != null)
			{
				obj.LogInfo((object)str);
			}
		}

		private void Awake()
		{
			if ((Object)(object)Instance != (Object)null)
			{
				throw new Exception("More than 1 plugin instance.");
			}
			Instance = this;
			logger = ((BaseUnityPlugin)this).Logger;
			config = ((BaseUnityPlugin)this).Config;
			InstrumentsConfig.Load();
			AddLog("Plugin com.bean.Instruments4Music is loaded!");
			Type[] types = Assembly.GetExecutingAssembly().GetTypes();
			Type[] array = types;
			foreach (Type type in array)
			{
				MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
				MethodInfo[] array2 = methods;
				foreach (MethodInfo methodInfo in array2)
				{
					object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
					if (customAttributes.Length != 0)
					{
						methodInfo.Invoke(null, null);
					}
				}
			}
			Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "com.bean.Instruments4Music");
			string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location);
			if (directoryName != null)
			{
				string text = Path.Combine(directoryName, "instrumentassets");
				AssetBundle val = AssetBundle.LoadFromFile(text);
				HudPrefab = val.LoadAsset<GameObject>("MusicPanel");
				TuneMixer = val.LoadAsset<AudioMixer>("Tuner");
			}
		}
	}
	[HarmonyPatch(typeof(StartOfRound))]
	internal class StartOfRoundPatch
	{
		[HarmonyPostfix]
		[HarmonyPatch("Awake")]
		private static void StartPatch(StartOfRound __instance)
		{
			ManualCameraRenderer mapScreen = __instance.mapScreen;
			object obj;
			if (mapScreen == null)
			{
				obj = null;
			}
			else
			{
				MeshRenderer mesh = mapScreen.mesh;
				obj = ((mesh != null) ? ((Component)mesh).gameObject : null);
			}
			GameObject val = (GameObject)obj;
			if (!((Object)(object)val == (Object)null))
			{
				if ((Object)(object)val.GetComponent<StationaryScript>() == (Object)null)
				{
					Instruments4MusicPlugin.Stationary = ((Component)__instance).gameObject.AddComponent<StationaryScript>();
					Instruments4MusicPlugin.AddLog($"StationaryScript Added, owner: {((NetworkBehaviour)Instruments4MusicPlugin.Stationary).OwnerClientId}");
				}
				if ((Object)(object)val.GetComponent<PortableScript>() == (Object)null)
				{
					Instruments4MusicPlugin.Portable = ((Component)__instance).gameObject.AddComponent<PortableScript>();
					Instruments4MusicPlugin.AddLog($"PortableScript Added, owner: {((NetworkBehaviour)Instruments4MusicPlugin.Portable).OwnerClientId}");
				}
				if ((Object)(object)val.GetComponent<TuneAudioScript>() == (Object)null)
				{
					Instruments4MusicPlugin.Tune = ((Component)__instance).gameObject.AddComponent<TuneAudioScript>();
					Instruments4MusicPlugin.AddLog($"TuneAudioScript Added, owner: {((NetworkBehaviour)Instruments4MusicPlugin.Tune).OwnerClientId}");
				}
				if ((Object)(object)val.GetComponent<MusicHud>() == (Object)null)
				{
					val.AddComponent<MusicHud>();
					Instruments4MusicPlugin.AddLog("MusicHUD Added");
				}
			}
		}
	}
	[HarmonyPatch(typeof(HUDManager))]
	public class HudPatches
	{
		[HarmonyPostfix]
		[HarmonyPatch("Awake")]
		private static void Awake_Postfix(HUDManager __instance)
		{
			//IL_005d: 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_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Expected O, but got Unknown
			Instruments4MusicPlugin.HudManager = __instance;
			HUDElement[] privateField = __instance.GetPrivateField<HUDElement[]>("HUDElements");
			GameObject val = (Instruments4MusicPlugin.HudInstance = Object.Instantiate<GameObject>(Instruments4MusicPlugin.HudPrefab, ((Component)privateField[0].canvasGroup).transform.parent));
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			Transform transform = val.transform;
			Vector3 val2 = new Vector3(1f, 1f, 1f);
			ConfigEntry<float>? configHudScale = InstrumentsConfig.ConfigHudScale;
			float num;
			if (configHudScale != null)
			{
				_ = configHudScale.Value;
				if (true)
				{
					num = InstrumentsConfig.ConfigHudScale.Value;
					goto IL_0088;
				}
			}
			num = 1f;
			goto IL_0088;
			IL_0088:
			transform.localScale = val2 * num;
			Instruments4MusicPlugin.AddLog("MusicHUD Instantiated");
			HUDElement val3 = (Instruments4MusicPlugin.HudElement = new HUDElement());
			CanvasGroup canvasGroup = val.GetComponent<CanvasGroup>() ?? val.AddComponent<CanvasGroup>();
			val3.canvasGroup = canvasGroup;
			__instance.PingHUDElement(val3, 0f, 0f, 0f);
			HUDElement[] array = privateField;
			List<HUDElement> list = new List<HUDElement>(1 + array.Length);
			HUDElement[] array2 = array;
			foreach (HUDElement item in array2)
			{
				list.Add(item);
			}
			list.Add(val3);
			List<HUDElement> list2 = list;
			List<HUDElement> list3 = list2;
			int num2 = 0;
			HUDElement[] array3 = (HUDElement[])(object)new HUDElement[list3.Count];
			foreach (HUDElement item2 in list3)
			{
				array3[num2] = item2;
				num2++;
			}
			privateField = array3;
			((object)__instance).GetType().GetField("HUDElements", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(__instance, privateField);
		}
	}
	public class InstrumentsConfig
	{
		internal static ConfigEntry<float>? ConfigHudScale;

		internal static ConfigEntry<float>? ConfigHudTransparency;

		internal static ConfigEntry<float>? TuneLastTime;

		internal static ConfigEntry<float>? VolumeAttenuationCoeff;

		internal static ConfigEntry<float>? SoftTuneModifier;

		internal static ConfigEntry<float>? SustainTuneModifier;

		internal static ConfigEntry<int>? AlarmHornBasePitch;

		internal static ConfigEntry<bool>? AlarmHornLoop;

		internal static ConfigEntry<int>? NoisyPropPitch;

		internal static ConfigEntry<bool>? NoisyPropLoop;

		internal static ConfigEntry<int>? StationaryPitch;

		internal static ConfigEntry<bool>? StationaryLoop;

		internal static ConfigEntry<int>? StationaryAudio;

		internal static ConfigEntry<int>? PotablePitch;

		internal static ConfigEntry<bool>? PotableLoop;

		internal static ConfigEntry<int>? PotableAudio;

		public static void Load()
		{
			ConfigFile? config = Instruments4MusicPlugin.config;
			ConfigHudScale = ((config != null) ? config.Bind<float>("HUDConfig", "HUDScale", 0.45f, "Scale the music HUD.") : null);
			ConfigFile? config2 = Instruments4MusicPlugin.config;
			ConfigHudTransparency = ((config2 != null) ? config2.Bind<float>("HUDConfig", "HUDTransparency", 1f, "Transparency of the music HUD.") : null);
			ConfigFile? config3 = Instruments4MusicPlugin.config;
			TuneLastTime = ((config3 != null) ? config3.Bind<float>("TuneModifiers", "TuneLastTime", 3f, "The audio will stop playing at TuneLastTime.(unit: seconds)") : null);
			ConfigFile? config4 = Instruments4MusicPlugin.config;
			VolumeAttenuationCoeff = ((config4 != null) ? config4.Bind<float>("TuneModifiers", "VolumeAttenuationCoeff", 2f, "Volume = exp(-alpha * t), alpha is this coefficient, t is time.") : null);
			ConfigFile? config5 = Instruments4MusicPlugin.config;
			SoftTuneModifier = ((config5 != null) ? config5.Bind<float>("TuneModifiers", "SoftTuneModifier", 0.5f, "When you hit the soft pedal. Volume = Volume * SoftModifier") : null);
			ConfigFile? config6 = Instruments4MusicPlugin.config;
			SustainTuneModifier = ((config6 != null) ? config6.Bind<float>("TuneModifiers", "SustainTuneModifier", 4f, "When you hit the sustain pedal. TuneLastTime = TuneLastTime * SustainModifier, and the Volume also attenuate slower.") : null);
			ConfigFile? config7 = Instruments4MusicPlugin.config;
			AlarmHornBasePitch = ((config7 != null) ? config7.Bind<int>("AlarmHornConfig", "AlarmHornBasePitch", 8, "The default audio \"ShipAlarmHornConstant.ogg\" is approximately C1#\n[0, 35] refers to [Low C, High B]") : null);
			ConfigFile? config8 = Instruments4MusicPlugin.config;
			AlarmHornLoop = ((config8 != null) ? config8.Bind<bool>("AlarmHornConfig", "AlarmHornLoop", true, "Playback the audio repeatedly until you stop pressing.") : null);
			ConfigFile? config9 = Instruments4MusicPlugin.config;
			NoisyPropPitch = ((config9 != null) ? config9.Bind<int>("NoisyPropDefault", "NoisyPropPitch", 12, "For activable props like Air Horn or Clown Horn.\n12 means Mid C.\n[0, 35] refers to [Low C, High B]") : null);
			ConfigFile? config10 = Instruments4MusicPlugin.config;
			NoisyPropLoop = ((config10 != null) ? config10.Bind<bool>("NoisyPropDefault", "NoisyPropLoop", false, "For activable props like Air Horn or Clown Horn.\nPlayback the audio repeatedly until you stop pressing.") : null);
			ConfigFile? config11 = Instruments4MusicPlugin.config;
			StationaryPitch = ((config11 != null) ? config11.Bind<int>("StationaryDefault", "StationaryPitch", 12, "12 means Mid C.\n[0, 35] refers to [Low C, High B]") : null);
			ConfigFile? config12 = Instruments4MusicPlugin.config;
			StationaryLoop = ((config12 != null) ? config12.Bind<bool>("StationaryDefault", "StationaryLoop", false, "Playback the audio repeatedly until you stop pressing.") : null);
			ConfigFile? config13 = Instruments4MusicPlugin.config;
			StationaryAudio = ((config13 != null) ? config13.Bind<int>("StationaryDefault", "StationaryAudio", 0, "I'm not quite sure what these audio means, but anyway it's configurable.\n0-thisAudioSourceClip, 1-playWhileTrue, 2-boolTrueAudios, 3-boolFalseAudios, 4-secondaryAudios.") : null);
			ConfigFile? config14 = Instruments4MusicPlugin.config;
			PotablePitch = ((config14 != null) ? config14.Bind<int>("PotableDefault", "PotablePitch", 12, "12 means Mid C.\n[0, 35] refers to [Low C, High B]") : null);
			ConfigFile? config15 = Instruments4MusicPlugin.config;
			PotableLoop = ((config15 != null) ? config15.Bind<bool>("PotableDefault", "PotableLoop", false, "Playback the audio repeatedly until you stop pressing.") : null);
			ConfigFile? config16 = Instruments4MusicPlugin.config;
			PotableAudio = ((config16 != null) ? config16.Bind<int>("PotableDefault", "PotableAudio", 0, "I think I know what these audio means literally.\n0-dropSFX, 1-grabSFX, 2-pocketSFX, 3-throwSFX.") : null);
			Instruments4MusicPlugin.AddLog("All configs loaded!");
		}
	}
	public class MusicHud : MonoBehaviour
	{
		public static MusicHud? Instance;

		private readonly List<Image> _frameRectangles = new List<Image>();

		private readonly List<Image> _textRectangles = new List<Image>();

		private static readonly List<Text> ButtonTips = new List<Text>();

		private static readonly List<Image> MenuRectangles = new List<Image>();

		private static readonly List<Text> MenuTips = new List<Text>();

		private InputField inputField;

		public bool IsInputing = false;

		public Dictionary<int, IEnumerator> CurrentCoroutines = new Dictionary<int, IEnumerator>();

		private readonly Dictionary<int, bool> _rotateFinished = new Dictionary<int, bool>();

		private void Awake()
		{
			if ((Object)(object)Instance != (Object)null)
			{
				throw new Exception("More than one instance of UI!");
			}
			Instance = this;
		}

		private void Start()
		{
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Expected O, but got Unknown
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: 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_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_015f: Unknown result type (might be due to invalid IL or missing references)
			//IL_017d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0184: Expected O, but got Unknown
			//IL_01ba: 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_01df: 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)
			//IL_020d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0224: Unknown result type (might be due to invalid IL or missing references)
			//IL_023d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0242: 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_026a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0271: Expected O, but got Unknown
			//IL_0298: Unknown result type (might be due to invalid IL or missing references)
			//IL_029d: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0301: Unknown result type (might be due to invalid IL or missing references)
			//IL_0318: 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_0346: Unknown result type (might be due to invalid IL or missing references)
			//IL_0386: Unknown result type (might be due to invalid IL or missing references)
			//IL_038d: Expected O, but got Unknown
			//IL_03bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_03f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_040f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0426: Unknown result type (might be due to invalid IL or missing references)
			//IL_0440: Unknown result type (might be due to invalid IL or missing references)
			//IL_0445: Unknown result type (might be due to invalid IL or missing references)
			//IL_0456: Unknown result type (might be due to invalid IL or missing references)
			//IL_045b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0465: Unknown result type (might be due to invalid IL or missing references)
			//IL_0482: Unknown result type (might be due to invalid IL or missing references)
			//IL_0489: Expected O, but got Unknown
			//IL_04b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_04b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_04e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0520: Unknown result type (might be due to invalid IL or missing references)
			//IL_0537: 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_0565: Unknown result type (might be due to invalid IL or missing references)
			//IL_0597: Unknown result type (might be due to invalid IL or missing references)
			//IL_059e: Expected O, but got Unknown
			//IL_05d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_05d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_05f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_060f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0626: Unknown result type (might be due to invalid IL or missing references)
			//IL_063d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0656: Unknown result type (might be due to invalid IL or missing references)
			//IL_065b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0665: Unknown result type (might be due to invalid IL or missing references)
			//IL_0682: Unknown result type (might be due to invalid IL or missing references)
			//IL_0689: Expected O, but got Unknown
			//IL_06ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_06ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_0703: Unknown result type (might be due to invalid IL or missing references)
			//IL_071a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0731: Unknown result type (might be due to invalid IL or missing references)
			float num = ((InstrumentsConfig.ConfigHudTransparency == null) ? 1f : InstrumentsConfig.ConfigHudTransparency.Value);
			GameObject hudInstance = Instruments4MusicPlugin.HudInstance;
			Button[] componentsInChildren = hudInstance.GetComponentsInChildren<Button>();
			Image[] itemSlotIconFrames = Instruments4MusicPlugin.HudManager.itemSlotIconFrames;
			Instruments4MusicPlugin.AddLog("Draw MusicHUD");
			_frameRectangles.Clear();
			_textRectangles.Clear();
			ButtonTips.Clear();
			MenuRectangles.Clear();
			MenuTips.Clear();
			Button[] array = componentsInChildren;
			Rect rect;
			foreach (Button val in array)
			{
				RectTransform component = ((Component)val).GetComponent<RectTransform>();
				int num2 = Random.Range(0, itemSlotIconFrames.Length);
				Image val2 = itemSlotIconFrames[num2];
				GameObject val3 = new GameObject("FrameRectangle");
				val3.transform.SetParent(((Component)val).transform, false);
				Image val4 = val3.AddComponent<Image>();
				((Graphic)val4).color = Color32.op_Implicit(new Color32((byte)254, (byte)73, (byte)0, (byte)Math.Round(num * 255f)));
				val4.sprite = val2.sprite;
				RectTransform component2 = val3.GetComponent<RectTransform>();
				component2.anchorMin = new Vector2(0f, 0f);
				component2.anchorMax = new Vector2(1f, 1f);
				component2.sizeDelta = new Vector2(0f, 0f);
				component2.anchoredPosition = new Vector2(0f, 0f);
				_frameRectangles.Add(val4);
				GameObject val5 = new GameObject("TextRectangle");
				val5.transform.SetParent(((Component)val).transform, false);
				Image val6 = val5.AddComponent<Image>();
				((Graphic)val6).color = Color32.op_Implicit(new Color32((byte)254, (byte)73, (byte)0, (byte)Math.Round(num * 255f)));
				RectTransform component3 = val5.GetComponent<RectTransform>();
				component3.anchorMin = new Vector2(0.3f, 0.3f);
				component3.anchorMax = new Vector2(0.7f, 0.7f);
				component3.offsetMin = new Vector2(0f, 0f);
				component3.offsetMax = new Vector2(0f, 0f);
				rect = component.rect;
				component3.anchoredPosition = new Vector2(0f, -0.5f * ((Rect)(ref rect)).height);
				_textRectangles.Add(val6);
				GameObject val7 = new GameObject("ButtonTip");
				val7.transform.SetParent(val5.transform, false);
				Text val8 = val7.AddComponent<Text>();
				rect = component3.rect;
				val8.fontSize = (int)(0.8f * ((Rect)(ref rect)).height);
				val8.text = "A";
				((Graphic)val8).color = Color.white;
				val8.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
				val8.alignment = (TextAnchor)4;
				val8.fontStyle = (FontStyle)1;
				RectTransform component4 = val7.GetComponent<RectTransform>();
				component4.anchorMin = new Vector2(0f, 0f);
				component4.anchorMax = new Vector2(1f, 1f);
				component4.sizeDelta = new Vector2(0f, 0f);
				component4.anchoredPosition = new Vector2(0f, 0f);
				ButtonTips.Add(val8);
			}
			RectTransform component5 = hudInstance.GetComponent<RectTransform>();
			for (int j = 0; j < 5; j++)
			{
				GameObject val9 = new GameObject("MenuRectangle");
				val9.transform.SetParent(hudInstance.transform, false);
				Image val10 = val9.AddComponent<Image>();
				((Graphic)val10).color = Color32.op_Implicit(new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, (byte)0));
				RectTransform component6 = val9.GetComponent<RectTransform>();
				component6.anchorMin = new Vector2(0.41f, 0.46f);
				component6.anchorMax = new Vector2(0.59f, 0.54f);
				component6.offsetMin = new Vector2(0f, 0f);
				component6.offsetMax = new Vector2(0f, 0f);
				float num3 = (float)(j - 2) * 0.2f;
				rect = component5.rect;
				float num4 = num3 * ((Rect)(ref rect)).width;
				rect = component5.rect;
				component6.anchoredPosition = new Vector2(num4, -0.4f * ((Rect)(ref rect)).height);
				MenuRectangles.Add(val10);
				GameObject val11 = new GameObject("MenuTip");
				val11.transform.SetParent(val9.transform, false);
				Text val12 = val11.AddComponent<Text>();
				rect = component5.rect;
				val12.fontSize = (int)(0.04f * ((Rect)(ref rect)).height);
				val12.text = "Text";
				((Graphic)val12).color = new Color(1f, 1f, 1f, num);
				val12.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
				val12.alignment = (TextAnchor)4;
				RectTransform component7 = val11.GetComponent<RectTransform>();
				component7.anchorMin = new Vector2(0f, 0f);
				component7.anchorMax = new Vector2(1f, 1f);
				component7.sizeDelta = new Vector2(0f, 0f);
				component7.anchoredPosition = new Vector2(0f, 0f);
				MenuTips.Add(val12);
			}
			GameObject val13 = new GameObject("InputField");
			val13.transform.SetParent(hudInstance.transform, false);
			Image val14 = val13.AddComponent<Image>();
			((Graphic)val14).color = Color32.op_Implicit(new Color32((byte)254, (byte)73, (byte)0, (byte)Math.Round(num * 255f)));
			RectTransform component8 = val13.GetComponent<RectTransform>();
			component8.anchorMin = new Vector2(0.2f, 0.46f);
			component8.anchorMax = new Vector2(0.8f, 0.54f);
			component8.offsetMin = new Vector2(0f, 0f);
			component8.offsetMax = new Vector2(0f, 0f);
			rect = component5.rect;
			component8.anchoredPosition = new Vector2(0f, 0.4f * ((Rect)(ref rect)).height);
			inputField = val13.AddComponent<InputField>();
			GameObject val15 = new GameObject("InputText");
			val15.transform.SetParent(val13.transform, false);
			Text val16 = val15.AddComponent<Text>();
			inputField.text = "Press Enter to input music note...";
			((Graphic)val16).color = Color.white;
			val16.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
			RectTransform component9 = val15.GetComponent<RectTransform>();
			component9.anchorMin = new Vector2(0f, 0f);
			component9.anchorMax = new Vector2(1f, 1f);
			component9.offsetMin = new Vector2(10f, 10f);
			component9.offsetMax = new Vector2(-10f, -10f);
			inputField.textComponent = val16;
			Instruments4MusicPlugin.AddLog("Draw MusicHUD success");
		}

		public static void ShowUserInterface()
		{
			float value = InstrumentsConfig.ConfigHudTransparency.Value;
			UpdateButtonTips();
			MenuTips[0].text = "Quit: " + InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.CurtainCall);
			MenuTips[1].text = "Soft: " + InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.Soft);
			MenuTips[2].text = "Semi: " + InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.Semitone);
			MenuTips[3].text = "Sustain: " + InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.Sustain);
			MenuTips[4].text = "Switch: " + InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.ChangeMode);
			HUDManager? hudManager = Instruments4MusicPlugin.HudManager;
			if (hudManager != null)
			{
				hudManager.PingHUDElement(Instruments4MusicPlugin.HudElement, 0f, 0f, value);
			}
		}

		public static void UpdateButtonTips()
		{
			Instruments4MusicPlugin.AddLog("Load key binds");
			string[] array = (TuneAudioScript.SecondaryKeyBind ? new string[21]
			{
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.LowCKey2),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.LowDKey2),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.LowEKey2),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.LowFKey2),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.LowGKey2),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.LowAKey2),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.LowBKey2),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.MidCKey2),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.MidDKey2),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.MidEKey2),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.MidFKey2),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.MidGKey2),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.MidAKey2),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.MidBKey2),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.HighCKey2),
				"",
				"",
				"",
				"",
				"",
				""
			} : new string[21]
			{
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.LowCKey),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.LowDKey),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.LowEKey),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.LowFKey),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.LowGKey),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.LowAKey),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.LowBKey),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.MidCKey),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.MidDKey),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.MidEKey),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.MidFKey),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.MidGKey),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.MidAKey),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.MidBKey),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.HighCKey),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.HighDKey),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.HighEKey),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.HighFKey),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.HighGKey),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.HighAKey),
				InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.HighBKey)
			});
			for (int i = 0; i < array.Length; i++)
			{
				ButtonTips[i].text = array[i];
			}
			Instruments4MusicPlugin.AddLog("Load key binds success");
		}

		public static void HideUserInterface()
		{
			HUDManager? hudManager = Instruments4MusicPlugin.HudManager;
			if (hudManager != null)
			{
				hudManager.PingHUDElement(Instruments4MusicPlugin.HudElement, 0f, 1f, 0f);
			}
		}

		private IEnumerator RotateOverTime(int noteNumber, RectTransform rectTransform)
		{
			Image textImage = _textRectangles[noteNumber];
			Color textImageColor = ((Graphic)textImage).color;
			textImageColor.a = 1f;
			((Graphic)textImage).color = textImageColor;
			Quaternion rotation;
			while (true)
			{
				rotation = ((Transform)rectTransform).rotation;
				if (!(((Quaternion)(ref rotation)).eulerAngles.y < 180f))
				{
					break;
				}
				float step = 360f * Time.deltaTime;
				rotation = ((Transform)rectTransform).rotation;
				float newAngle = Mathf.Min(((Quaternion)(ref rotation)).eulerAngles.y + step, 180f);
				((Transform)rectTransform).rotation = Quaternion.Euler(((Transform)rectTransform).eulerAngles.x, newAngle, ((Transform)rectTransform).eulerAngles.z);
				yield return null;
			}
			textImageColor.a = 0.5f;
			((Graphic)textImage).color = textImageColor;
			_rotateFinished[noteNumber] = true;
			while (true)
			{
				rotation = ((Transform)rectTransform).rotation;
				if (((Quaternion)(ref rotation)).eulerAngles.y > 0f)
				{
					float step2 = 360f * Time.deltaTime;
					rotation = ((Transform)rectTransform).rotation;
					float newAngle2 = Mathf.Max(((Quaternion)(ref rotation)).eulerAngles.y - step2, 0f);
					((Transform)rectTransform).rotation = Quaternion.Euler(((Transform)rectTransform).eulerAngles.x, newAngle2, ((Transform)rectTransform).eulerAngles.z);
					yield return null;
					continue;
				}
				break;
			}
		}

		public void OnButtonClicked(int num)
		{
			int num2 = NoteNumberConvert(num);
			if (!_rotateFinished.ContainsKey(num2) || _rotateFinished[num2])
			{
				if (CurrentCoroutines.TryGetValue(num2, out IEnumerator value))
				{
					((MonoBehaviour)this).StopCoroutine(value);
				}
				_rotateFinished[num2] = false;
				CurrentCoroutines[num2] = RotateOverTime(num2, ((Graphic)_frameRectangles[num2]).rectTransform);
				((MonoBehaviour)this).StartCoroutine(CurrentCoroutines[num2]);
			}
		}

		public void OnMenuClicked(int num, bool isHolding)
		{
			//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_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			float num2 = (isHolding ? 1f : 0f);
			Color32 val = Color32.op_Implicit(((Graphic)MenuRectangles[num]).color);
			val.a = (byte)(num2 * 255f);
			((Graphic)MenuRectangles[num]).color = Color32.op_Implicit(val);
		}

		private static int NoteNumberConvert(int num)
		{
			int[] array = new int[12]
			{
				0, 0, 1, 1, 2, 3, 3, 4, 4, 5,
				5, 6
			};
			return num / 12 * 7 + array[num % 12];
		}

		public void TriggerInputNote()
		{
			if (IsInputing)
			{
				inputField.DeactivateInputField();
				IsInputing = false;
				Instruments4MusicPlugin.AddLog("Input stop, get note: " + inputField.text + ".");
				TuneAudioScript.InitAutoPlay(inputField.text);
			}
			else
			{
				Instruments4MusicPlugin.AddLog("Input start.");
				inputField.ActivateInputField();
				IsInputing = true;
			}
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "com.bean.Instruments4Music";

		public const string PLUGIN_NAME = "Instruments4Music";

		public const string PLUGIN_VERSION = "2.1.0";
	}
	public class PortableScript : NetworkBehaviour
	{
		private const int InteractableObjectsMask = 512;

		private static PlayerControllerB? Player => GameNetworkManager.Instance?.localPlayerController;

		public static bool IsHoldingInstrument(out GameObject? instrumentObj)
		{
			if ((Object)(object)Player != (Object)null)
			{
				PlayerControllerB player = Player;
				if (((player != null && ((NetworkBehaviour)player).IsOwner && player.isPlayerControlled && (!((NetworkBehaviour)Player).IsServer || Player.isHostPlayerObject)) || Player.isTestingPlayer) && Player.isHoldingObject && !((Object)(object)Player.currentlyHeldObjectServer == (Object)null) && !Player.quickMenuManager.isMenuOpen && !Player.isPlayerDead)
				{
					if (!Player.currentlyHeldObjectServer.itemProperties.usableInSpecialAnimations)
					{
						player = Player;
						if (player == null || player.isGrabbingObjectAnimation || player.inTerminalMenu || player.isTypingChat || (Player.inSpecialInteractAnimation && !Player.inShockingMinigame))
						{
							goto IL_00f1;
						}
					}
					PlayerControllerB? player2 = Player;
					object obj;
					if (player2 == null)
					{
						obj = null;
					}
					else
					{
						GrabbableObject currentlyHeldObjectServer = player2.currentlyHeldObjectServer;
						obj = ((currentlyHeldObjectServer != null) ? ((Component)currentlyHeldObjectServer).gameObject : null);
					}
					instrumentObj = (GameObject?)obj;
					return (Object)(object)instrumentObj != (Object)null;
				}
			}
			goto IL_00f1;
			IL_00f1:
			instrumentObj = null;
			return false;
		}

		[ServerRpc(RequireOwnership = false)]
		public void LetShowBeginsServerRpc(ulong playerId, ulong objectId)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: 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_0096: 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(1403104735u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, playerId);
					BytePacker.WriteValueBitPacked(val2, objectId);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1403104735u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					Instruments4MusicPlugin.AddLog($"LetShowBeginsServerRpc, owner: {((NetworkBehaviour)this).OwnerClientId}");
					LetShowBeginsClientRpc(playerId, objectId);
				}
			}
		}

		[ClientRpc]
		public void LetShowBeginsClientRpc(ulong playerId, ulong objectId)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: 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_0096: 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(758432294u, val, (RpcDelivery)0);
				BytePacker.WriteValueBitPacked(val2, playerId);
				BytePacker.WriteValueBitPacked(val2, objectId);
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 758432294u, val, (RpcDelivery)0);
			}
			if ((int)base.__rpc_exec_stage != 2 || (!networkManager.IsClient && !networkManager.IsHost))
			{
				return;
			}
			NetworkManager.Singleton.SpawnManager.SpawnedObjects.TryGetValue(objectId, out var value);
			GameObject gameObject = ((Component)value).gameObject;
			NoisemakerProp component = gameObject.GetComponent<NoisemakerProp>();
			if ((Object)(object)component != (Object)null && InstrumentsConfig.NoisyPropPitch != null && InstrumentsConfig.NoisyPropLoop != null)
			{
				Instruments4MusicPlugin.AddLog("Playing " + ((Object)component).name);
				AudioClip val3 = null;
				if ((Object)(object)component.noiseAudio.clip != (Object)null)
				{
					val3 = component.noiseAudio.clip;
				}
				else if (component.noiseSFX.Length != 0)
				{
					val3 = component.noiseSFX[0];
				}
				if ((Object)(object)val3 != (Object)null)
				{
					TuneAudioScript.RegisterInstrClip(playerId, gameObject, InstrumentsConfig.NoisyPropPitch.Value, val3, InstrumentsConfig.NoisyPropLoop.Value);
					return;
				}
			}
			if (InstrumentsConfig.PotablePitch == null || InstrumentsConfig.PotableLoop == null)
			{
				return;
			}
			WhoopieCushionItem component2 = gameObject.GetComponent<WhoopieCushionItem>();
			if ((Object)(object)component2 != (Object)null)
			{
				Instruments4MusicPlugin.AddLog("Playing " + ((Object)component2).name);
				TuneAudioScript.RegisterInstrClip(playerId, gameObject, InstrumentsConfig.PotablePitch.Value, component2.fartAudios[Random.Range(0, component2.fartAudios.Length)], InstrumentsConfig.PotableLoop.Value);
				return;
			}
			GrabbableObject component3 = gameObject.GetComponent<GrabbableObject>();
			if (!((Object)(object)component3 != (Object)null))
			{
				return;
			}
			Instruments4MusicPlugin.AddLog("Playing " + ((Object)component3).name);
			AudioClip val4 = null;
			if (InstrumentsConfig.PotableAudio != null)
			{
				if (InstrumentsConfig.PotableAudio.Value == 0)
				{
					val4 = component3.itemProperties.dropSFX;
				}
				else if (InstrumentsConfig.PotableAudio.Value == 1)
				{
					val4 = component3.itemProperties.grabSFX;
				}
				else if (InstrumentsConfig.PotableAudio.Value == 2)
				{
					val4 = component3.itemProperties.pocketSFX;
				}
				else if (InstrumentsConfig.PotableAudio.Value == 3)
				{
					val4 = component3.itemProperties.throwSFX;
				}
			}
			if ((Object)(object)val4 != (Object)null)
			{
				TuneAudioScript.RegisterInstrClip(playerId, gameObject, InstrumentsConfig.PotablePitch.Value, val4, InstrumentsConfig.PotableLoop.Value);
				return;
			}
			if ((Object)(object)component3.itemProperties.dropSFX != (Object)null)
			{
				val4 = component3.itemProperties.dropSFX;
			}
			else if ((Object)(object)component3.itemProperties.grabSFX != (Object)null)
			{
				val4 = component3.itemProperties.grabSFX;
			}
			else if ((Object)(object)component3.itemProperties.pocketSFX != (Object)null)
			{
				val4 = component3.itemProperties.pocketSFX;
			}
			else if ((Object)(object)component3.itemProperties.throwSFX != (Object)null)
			{
				val4 = component3.itemProperties.throwSFX;
			}
			if ((Object)(object)val4 != (Object)null)
			{
				TuneAudioScript.RegisterInstrClip(playerId, gameObject, InstrumentsConfig.PotablePitch.Value, val4, InstrumentsConfig.PotableLoop.Value);
			}
		}

		public void Update()
		{
			if (!((Object)(object)Player == (Object)null) && !TuneAudioScript.TheShowIsOn && IsHoldingInstrument(out GameObject instrumentObj) && Instruments4MusicPlugin.InputActionsInstance.Showtime != null)
			{
				GrabbableObject val = ((instrumentObj != null) ? instrumentObj.GetComponent<GrabbableObject>() : null);
				if (!((Object)(object)val == (Object)null))
				{
					string text = "Showtime!: [" + InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.Showtime) + "] (Hold)";
					HUDManager.Instance.ChangeControlTipMultiple(CollectionExtensions.AddToArray<string>(val.itemProperties.toolTips, text), true, val.itemProperties);
				}
			}
		}

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

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_PortableScript()
		{
			//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
			NetworkManager.__rpc_func_table.Add(1403104735u, new RpcReceiveHandler(__rpc_handler_1403104735));
			NetworkManager.__rpc_func_table.Add(758432294u, new RpcReceiveHandler(__rpc_handler_758432294));
		}

		private static void __rpc_handler_1403104735(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_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				ulong playerId = default(ulong);
				ByteUnpacker.ReadValueBitPacked(reader, ref playerId);
				ulong objectId = default(ulong);
				ByteUnpacker.ReadValueBitPacked(reader, ref objectId);
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((PortableScript)(object)target).LetShowBeginsServerRpc(playerId, objectId);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_758432294(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_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				ulong playerId = default(ulong);
				ByteUnpacker.ReadValueBitPacked(reader, ref playerId);
				ulong objectId = default(ulong);
				ByteUnpacker.ReadValueBitPacked(reader, ref objectId);
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((PortableScript)(object)target).LetShowBeginsClientRpc(playerId, objectId);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string? __getTypeName()
		{
			return "PortableScript";
		}
	}
	internal static class ReflectionUtils
	{
		public static T GetPrivateField<T>(this object obj, string field)
		{
			return (T)obj.GetType().GetField(field, BindingFlags.Instance | BindingFlags.NonPublic).GetValue(obj);
		}
	}
	public class StationaryScript : NetworkBehaviour
	{
		private const int InteractableObjectsMask = 512;

		private static PlayerControllerB? Player => GameNetworkManager.Instance?.localPlayerController;

		public static bool IsLookingAtInstrument(out GameObject? instrumentObj)
		{
			//IL_002f: 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_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: 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_00a1: 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_00ab: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)Player == (Object)null)
			{
				instrumentObj = null;
				return false;
			}
			Ray val = default(Ray);
			((Ray)(ref val))..ctor(((Component)Player.gameplayCamera).transform.position, ((Component)Player.gameplayCamera).transform.forward);
			if (Player.isTypingChat)
			{
				instrumentObj = null;
				return false;
			}
			RaycastHit val2 = default(RaycastHit);
			if (!Physics.Raycast(val, ref val2, Player.grabDistance, 512, (QueryTriggerInteraction)1) && !Physics.Raycast(((Component)Player.gameplayCamera).transform.position + Vector3.up * 5f, Vector3.down, ref val2, 5f, 512, (QueryTriggerInteraction)1))
			{
				instrumentObj = null;
				return false;
			}
			instrumentObj = ((Component)((RaycastHit)(ref val2)).collider).gameObject;
			if ((Object)(object)instrumentObj == (Object)null)
			{
				instrumentObj = null;
				return false;
			}
			ShipAlarmCord component = instrumentObj.GetComponent<ShipAlarmCord>();
			if ((Object)(object)component != (Object)null)
			{
				return true;
			}
			ItemCharger component2 = instrumentObj.GetComponent<ItemCharger>();
			if ((Object)(object)component2 != (Object)null)
			{
				return true;
			}
			AnimatedObjectTrigger component3 = instrumentObj.GetComponent<AnimatedObjectTrigger>();
			if ((Object)(object)component3 != (Object)null)
			{
				return true;
			}
			return false;
		}

		[ServerRpc(RequireOwnership = false)]
		public void LetShowBeginsServerRpc(ulong playerId, ulong objectId)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: 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_0096: 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(356583999u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, playerId);
					BytePacker.WriteValueBitPacked(val2, objectId);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 356583999u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					Instruments4MusicPlugin.AddLog($"LetShowBeginsServerRpc, owner: {((NetworkBehaviour)this).OwnerClientId}");
					LetShowBeginsClientRpc(playerId, objectId);
				}
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void LetShowBeginsServerRpc(ulong playerId, ulong objId, string path)
		{
			//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_007e: 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_00a8: 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(2002104037u, val, (RpcDelivery)0);
				BytePacker.WriteValueBitPacked(val2, playerId);
				BytePacker.WriteValueBitPacked(val2, objId);
				bool flag = path != null;
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives));
				if (flag)
				{
					((FastBufferWriter)(ref val2)).WriteValueSafe(path, false);
				}
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2002104037u, val, (RpcDelivery)0);
			}
			if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
			{
				Instruments4MusicPlugin.AddLog($"LetShowBeginsServerRpc, owner: {((NetworkBehaviour)this).OwnerClientId}");
				LetShowBeginsClientRpc(playerId, objId, path);
			}
		}

		[ClientRpc]
		public void LetShowBeginsClientRpc(ulong playerId, ulong objId, string path)
		{
			//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_007e: 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_00a8: 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 != 2 && (networkManager.IsServer || networkManager.IsHost))
			{
				ClientRpcParams val = default(ClientRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(119991791u, val, (RpcDelivery)0);
				BytePacker.WriteValueBitPacked(val2, playerId);
				BytePacker.WriteValueBitPacked(val2, objId);
				bool flag = path != null;
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives));
				if (flag)
				{
					((FastBufferWriter)(ref val2)).WriteValueSafe(path, false);
				}
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 119991791u, val, (RpcDelivery)0);
			}
			if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
			{
				GameObject val3 = TuneAudioScript.FindGameObjectFromPath(objId, path);
				if ((Object)(object)val3 == (Object)null)
				{
					Instruments4MusicPlugin.AddLog("Cannot find instrumentObj.");
				}
				else
				{
					LetShowBegins(playerId, val3);
				}
			}
		}

		[ClientRpc]
		public void LetShowBeginsClientRpc(ulong playerId, ulong objectId)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: 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_0096: 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(3302296507u, val, (RpcDelivery)0);
				BytePacker.WriteValueBitPacked(val2, playerId);
				BytePacker.WriteValueBitPacked(val2, objectId);
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3302296507u, val, (RpcDelivery)0);
			}
			if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
			{
				NetworkManager.Singleton.SpawnManager.SpawnedObjects.TryGetValue(objectId, out var value);
				if ((Object)(object)value == (Object)null)
				{
					Instruments4MusicPlugin.AddLog("Cannot find instrumentObj.");
					return;
				}
				GameObject gameObject = ((Component)value).gameObject;
				LetShowBegins(playerId, gameObject);
			}
		}

		public void LetShowBegins(ulong playerId, GameObject instrumentObj)
		{
			ShipAlarmCord component = instrumentObj.GetComponent<ShipAlarmCord>();
			if ((Object)(object)component != (Object)null && InstrumentsConfig.AlarmHornBasePitch != null && InstrumentsConfig.AlarmHornLoop != null)
			{
				Instruments4MusicPlugin.AddLog("Playing " + ((Object)component).name);
				TuneAudioScript.RegisterInstrClip(playerId, instrumentObj, InstrumentsConfig.AlarmHornBasePitch.Value, component.hornClose.clip, InstrumentsConfig.AlarmHornLoop.Value);
			}
			else
			{
				if (InstrumentsConfig.StationaryPitch == null || InstrumentsConfig.StationaryLoop == null)
				{
					return;
				}
				ItemCharger component2 = instrumentObj.GetComponent<ItemCharger>();
				if ((Object)(object)component2 != (Object)null)
				{
					Instruments4MusicPlugin.AddLog("Playing " + ((Object)component2).name);
					TuneAudioScript.RegisterInstrClip(playerId, instrumentObj, InstrumentsConfig.StationaryPitch.Value, component2.zapAudio.clip, InstrumentsConfig.StationaryLoop.Value);
					return;
				}
				AnimatedObjectTrigger component3 = instrumentObj.GetComponent<AnimatedObjectTrigger>();
				if (!((Object)(object)component3 != (Object)null))
				{
					return;
				}
				Instruments4MusicPlugin.AddLog("Playing " + ((Object)component3).name);
				AudioClip val = null;
				if (InstrumentsConfig.StationaryAudio != null)
				{
					if (InstrumentsConfig.StationaryAudio.Value == 0)
					{
						val = component3.thisAudioSource.clip;
					}
					else if (InstrumentsConfig.StationaryAudio.Value == 1)
					{
						val = component3.playWhileTrue;
					}
					else if (InstrumentsConfig.StationaryAudio.Value == 2)
					{
						val = component3.boolTrueAudios[0];
					}
					else if (InstrumentsConfig.StationaryAudio.Value == 3)
					{
						val = component3.boolFalseAudios[0];
					}
					else if (InstrumentsConfig.StationaryAudio.Value == 4)
					{
						val = component3.secondaryAudios[0];
					}
				}
				if ((Object)(object)val != (Object)null)
				{
					TuneAudioScript.RegisterInstrClip(playerId, instrumentObj, InstrumentsConfig.StationaryPitch.Value, val, InstrumentsConfig.StationaryLoop.Value);
					return;
				}
				if ((Object)(object)component3.thisAudioSource.clip != (Object)null)
				{
					val = component3.thisAudioSource.clip;
				}
				else if ((Object)(object)component3.playWhileTrue != (Object)null)
				{
					val = component3.playWhileTrue;
				}
				else if (component3.boolTrueAudios.Length != 0)
				{
					val = component3.boolTrueAudios[0];
				}
				else if (component3.boolFalseAudios.Length != 0)
				{
					val = component3.boolFalseAudios[0];
				}
				else if (component3.secondaryAudios.Length != 0)
				{
					val = component3.secondaryAudios[0];
				}
				if ((Object)(object)val != (Object)null)
				{
					TuneAudioScript.RegisterInstrClip(playerId, instrumentObj, InstrumentsConfig.StationaryPitch.Value, val, InstrumentsConfig.StationaryLoop.Value);
				}
			}
		}

		public void Update()
		{
			if (TuneAudioScript.TheShowIsOn || !IsLookingAtInstrument(out GameObject instrumentObj) || (Object)(object)Player == (Object)null || Instruments4MusicPlugin.InputActionsInstance.Showtime == null)
			{
				return;
			}
			string text = "Showtime!: [" + InputActions.GetButtonDescription(Instruments4MusicPlugin.InputActionsInstance.Showtime) + "] (Hold)";
			InteractTrigger val = ((instrumentObj != null) ? instrumentObj.GetComponent<InteractTrigger>() : null);
			if (!((Object)(object)val == (Object)null) && !val.hoverTip.EndsWith(text))
			{
				val.hoverTip = val.hoverTip + "\n" + text;
				Regex regex = new Regex("Showtime!: \\[.*?] \\(Hold\\)$");
				if (regex.IsMatch(val.hoverTip))
				{
					val.hoverTip = regex.Replace(val.hoverTip, text);
				}
				else
				{
					val.hoverTip = val.hoverTip + "\n" + text;
				}
			}
		}

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

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_StationaryScript()
		{
			//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
			NetworkManager.__rpc_func_table.Add(356583999u, new RpcReceiveHandler(__rpc_handler_356583999));
			NetworkManager.__rpc_func_table.Add(2002104037u, new RpcReceiveHandler(__rpc_handler_2002104037));
			NetworkManager.__rpc_func_table.Add(119991791u, new RpcReceiveHandler(__rpc_handler_119991791));
			NetworkManager.__rpc_func_table.Add(3302296507u, new RpcReceiveHandler(__rpc_handler_3302296507));
		}

		private static void __rpc_handler_356583999(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_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				ulong playerId = default(ulong);
				ByteUnpacker.ReadValueBitPacked(reader, ref playerId);
				ulong objectId = default(ulong);
				ByteUnpacker.ReadValueBitPacked(reader, ref objectId);
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((StationaryScript)(object)target).LetShowBeginsServerRpc(playerId, objectId);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_2002104037(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_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);
				ulong objId = default(ulong);
				ByteUnpacker.ReadValueBitPacked(reader, ref objId);
				bool flag = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives));
				string path = null;
				if (flag)
				{
					((FastBufferReader)(ref reader)).ReadValueSafe(ref path, false);
				}
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((StationaryScript)(object)target).LetShowBeginsServerRpc(playerId, objId, path);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_119991791(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_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);
				ulong objId = default(ulong);
				ByteUnpacker.ReadValueBitPacked(reader, ref objId);
				bool flag = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives));
				string path = null;
				if (flag)
				{
					((FastBufferReader)(ref reader)).ReadValueSafe(ref path, false);
				}
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((StationaryScript)(object)target).LetShowBeginsClientRpc(playerId, objId, path);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_3302296507(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_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				ulong playerId = default(ulong);
				ByteUnpacker.ReadValueBitPacked(reader, ref playerId);
				ulong objectId = default(ulong);
				ByteUnpacker.ReadValueBitPacked(reader, ref objectId);
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((StationaryScript)(object)target).LetShowBeginsClientRpc(playerId, objectId);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "StationaryScript";
		}
	}
	public class TuneAudioScript : NetworkBehaviour
	{
		private float timer = 0f;

		public float interval = 1f;

		private const double TuneCoeff = 1.0594631433486938;

		private static readonly float LastTimer;

		public static readonly float AttenuationCoeff;

		public static readonly float SoftModifier;

		private static readonly float SustainModifier;

		private static Dictionary<ulong, AudioClip> _instrClips;

		private static Dictionary<ulong, int> _sourceNoteNumber;

		private static Dictionary<ulong, bool> _loopAudio;

		private static Dictionary<ulong, Dictionary<int, AudioSource>> _tunedPlayerDictionary;

		private static Dictionary<ulong, ConcurrentDictionary<int, float>> _timerPlayerDictionary;

		private static readonly List<List<(int, bool, int)>> TuneList;

		private static readonly List<List<(int, bool, int)>> KeepTuneList;

		public static bool SecondaryTuneMethod;

		public static bool TheShowIsOn;

		public static bool SecondaryKeyBind;

		public static bool KeyBindInit;

		public static Dictionary<ulong, bool> IsSustaining;

		public static bool IsAutoPlayOn;

		public static float AutoPlaySpeed;

		public static float AutoPlayCount;

		public static Dictionary<ulong, GameObject> ActiveInstrObjects;

		private static PlayerControllerB? Player => GameNetworkManager.Instance?.localPlayerController;

		public static void RegisterInstrClip(ulong playerId, GameObject gameObject, int originNoteNumber, AudioClip clip, bool isLoop)
		{
			foreach (ConcurrentDictionary<int, float> value in _timerPlayerDictionary.Values)
			{
				value.Clear();
			}
			_timerPlayerDictionary.Clear();
			foreach (Dictionary<int, AudioSource> value2 in _tunedPlayerDictionary.Values)
			{
				foreach (AudioSource value3 in value2.Values)
				{
					if ((Object)(object)value3 != (Object)null)
					{
						value3.outputAudioMixerGroup = null;
						Object.Destroy((Object)(object)value3);
					}
				}
				value2.Clear();
			}
			_tunedPlayerDictionary.Clear();
			Instruments4MusicPlugin.AddLog("TunedDictionary cleared.");
			_instrClips[playerId] = clip;
			_sourceNoteNumber[playerId] = originNoteNumber;
			_loopAudio[playerId] = isLoop;
			ActiveInstrObjects[playerId] = gameObject;
			Instruments4MusicPlugin.AddLog("Playing " + ((Object)clip).name + ".");
		}

		public static void ActiveInstrument()
		{
			TheShowIsOn = true;
			MusicHud.ShowUserInterface();
			if ((Object)(object)MusicHud.Instance != (Object)null && MusicHud.Instance.IsInputing)
			{
				MusicHud.Instance.TriggerInputNote();
			}
			if (!SecondaryKeyBind)
			{
				DisableController();
			}
			Instruments4MusicPlugin.AddLog("Active Instrument.");
		}

		public static void DeActiveInstrument()
		{
			TheShowIsOn = false;
			EnableController();
			MusicHud.HideUserInterface();
			Instruments4MusicPlugin.AddLog("DeActive Instrument.");
		}

		[ServerRpc(RequireOwnership = false)]
		public void PlayTunedAudioServerRpc(ulong playerId, int targetNoteNumber, bool isSoft, bool newPulse, bool secondaryTuneMethod)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: 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_00b2: 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_00cd: 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)
			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(3699046614u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, playerId);
					BytePacker.WriteValueBitPacked(val2, targetNoteNumber);
					((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref isSoft, default(ForPrimitives));
					((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref newPulse, default(ForPrimitives));
					((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref secondaryTuneMethod, default(ForPrimitives));
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3699046614u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					PlayTunedAudioClientRpc(playerId, targetNoteNumber, isSoft, newPulse, secondaryTuneMethod);
				}
			}
		}

		[ClientRpc]
		public void PlayTunedAudioClientRpc(ulong playerId, int targetNoteNumber, bool isSoft, bool newPulse, bool secondaryTuneMethod)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: 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_00b2: 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_00cd: 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)
			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(305110489u, val, (RpcDelivery)0);
				BytePacker.WriteValueBitPacked(val2, playerId);
				BytePacker.WriteValueBitPacked(val2, targetNoteNumber);
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref isSoft, default(ForPrimitives));
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref newPulse, default(ForPrimitives));
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref secondaryTuneMethod, default(ForPrimitives));
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 305110489u, val, (RpcDelivery)0);
			}
			if ((int)base.__rpc_exec_stage != 2 || (!networkManager.IsClient && !networkManager.IsHost))
			{
				return;
			}
			MusicHud.Instance?.OnButtonClicked(targetNoteNumber);
			if (!_timerPlayerDictionary.ContainsKey(playerId))
			{
				_timerPlayerDictionary[playerId] = new ConcurrentDictionary<int, float>();
			}
			_timerPlayerDictionary[playerId][targetNoteNumber] = LastTimer;
			float num = 1f;
			if (isSoft && newPulse)
			{
				num -= SoftModifier;
			}
			int num2 = targetNoteNumber - _sourceNoteNumber[playerId];
			if (_tunedPlayerDictionary.TryGetValue(playerId, out Dictionary<int, AudioSource> value) && value.TryGetValue(targetNoteNumber, out var value2))
			{
				value2.volume = num;
				if (!newPulse)
				{
					return;
				}
				if (secondaryTuneMethod)
				{
					if (num2 > 12)
					{
						value2.pitch = (float)Math.Pow(1.0594631433486938, num2 - 12);
					}
					else if (num2 < -12)
					{
						value2.pitch = (float)Math.Pow(1.0594631433486938, num2 + 12);
					}
					else
					{
						value2.pitch = 1f;
					}
					AudioSource obj = value2;
					AudioMixer? tuneMixer = Instruments4MusicPlugin.TuneMixer;
					obj.outputAudioMixerGroup = ((tuneMixer != null) ? tuneMixer.FindMatchingGroups($"Tune{Math.Max(-12, Math.Min(12, num2))}")[0] : null);
				}
				else
				{
					if (num2 > 12)
					{
						AudioSource obj2 = value2;
						AudioMixer? tuneMixer2 = Instruments4MusicPlugin.TuneMixer;
						obj2.outputAudioMixerGroup = ((tuneMixer2 != null) ? tuneMixer2.FindMatchingGroups($"Tune{num2 - 12}")[0] : null);
					}
					else if (num2 < -12)
					{
						AudioSource obj3 = value2;
						AudioMixer? tuneMixer3 = Instruments4MusicPlugin.TuneMixer;
						obj3.outputAudioMixerGroup = ((tuneMixer3 != null) ? tuneMixer3.FindMatchingGroups($"Tune{num2 + 12}")[0] : null);
					}
					else
					{
						value2.outputAudioMixerGroup = null;
					}
					value2.pitch = (float)Math.Pow(1.0594631433486938, Math.Max(-12, Math.Min(12, num2)));
				}
				value2.Play();
			}
			else
			{
				if (!ActiveInstrObjects.ContainsKey(playerId) || !_instrClips.ContainsKey(playerId))
				{
					return;
				}
				GameObject obj4 = ActiveInstrObjects[playerId];
				value2 = ((obj4 != null) ? obj4.AddComponent<AudioSource>() : null);
				if ((Object)(object)value2 == (Object)null)
				{
					return;
				}
				if (secondaryTuneMethod)
				{
					if (num2 > 12)
					{
						value2.pitch = (float)Math.Pow(1.0594631433486938, num2 - 12);
					}
					else if (num2 < -12)
					{
						value2.pitch = (float)Math.Pow(1.0594631433486938, num2 + 12);
					}
					else
					{
						value2.pitch = 1f;
					}
					AudioSource obj5 = value2;
					AudioMixer? tuneMixer4 = Instruments4MusicPlugin.TuneMixer;
					obj5.outputAudioMixerGroup = ((tuneMixer4 != null) ? tuneMixer4.FindMatchingGroups($"Tune{Math.Max(-12, Math.Min(12, num2))}")[0] : null);
				}
				else
				{
					if (num2 > 12)
					{
						AudioSource obj6 = value2;
						AudioMixer? tuneMixer5 = Instruments4MusicPlugin.TuneMixer;
						obj6.outputAudioMixerGroup = ((tuneMixer5 != null) ? tuneMixer5.FindMatchingGroups($"Tune{num2 - 12}")[0] : null);
					}
					else if (num2 < -12)
					{
						AudioSource obj7 = value2;
						AudioMixer? tuneMixer6 = Instruments4MusicPlugin.TuneMixer;
						obj7.outputAudioMixerGroup = ((tuneMixer6 != null) ? tuneMixer6.FindMatchingGroups($"Tune{num2 + 12}")[0] : null);
					}
					else
					{
						value2.outputAudioMixerGroup = null;
					}
					value2.pitch = (float)Math.Pow(1.0594631433486938, Math.Max(-12, Math.Min(12, num2)));
				}
				value2.clip = _instrClips[playerId];
				value2.volume = num;
				value2.loop = _loopAudio[playerId];
				value2.spatialBlend = 1f;
				value2.spread = 26f;
				value2.rolloffMode = (AudioRolloffMode)1;
				value2.minDistance = 4f;
				value2.maxDistance = 21f;
				if (!_tunedPlayerDictionary.ContainsKey(playerId))
				{
					_tunedPlayerDictionary[playerId] = new Dictionary<int, AudioSource>();
				}
				_tunedPlayerDictionary[playerId][targetNoteNumber] = value2;
				value2.Play();
			}
		}

		public static void InitAutoPlay(string musicNotes)
		{
			IsAutoPlayOn = false;
			if (!TheShowIsOn)
			{
				return;
			}
			int[] array = new int[7] { 9, 11, 0, 2, 4, 5, 7 };
			int[] array2 = new int[7] { 12, 14, 16, 17, 19, 21, 23 };
			int[] array3 = new int[7] { 33, 35, 24, 26, 28, 29, 31 };
			string[] array4 = Regex.Replace(musicNotes, "\\s+", "").Split(',');
			int num = 0;
			TuneList.Clear();
			if (array4.Length < 2 || !float.TryParse(array4[0], out AutoPlaySpeed))
			{
				return;
			}
			for (int i = 1; i < array4.Length; i++)
			{
				List<(int, bool, int)> list = new List<(int, bool, int)>();
				if (array4[i].Length % 2 != 1 || array4[i].Length < 2)
				{
					TuneList.Add(list);
					continue;
				}
				char c = array4[i][0];
				bool flag = !char.IsDigit(c);
				bool flag2 = flag;
				if (flag2)
				{
					bool flag3;
					switch (c)
					{
					default:
						flag3 = true;
						break;
					case 'A':
					case 'B':
					case 'C':
					case 'D':
					case 'E':
					case 'F':
					case 'a':
					case 'b':
					case 'c':
					case 'd':
					case 'e':
					case 'f':
						flag3 = false;
						break;
					}
					flag2 = flag3;
				}
				if (flag2)
				{
					TuneList.Add(list);
					continue;
				}
				int num2 = Convert.ToInt32(c.ToString(), 16);
				IsSustaining[((NetworkBehaviour)Instruments4MusicPlugin.Player).NetworkObjectId] = (num2 & 1) != 0;
				bool item = (num2 & 2) != 0;
				for (int j = 1; j < array4[i].Length; j += 2)
				{
					char c2 = array4[i][j];
					char c3 = c2;
					char c4 = c3;
					int num3;
					if (c4 >= 'A')
					{
						if (c4 >= 'a')
						{
							if (c4 > 'g')
							{
								continue;
							}
							num3 = array[c2 - 97];
						}
						else
						{
							if (c4 > 'G')
							{
								continue;
							}
							num3 = array3[c2 - 65];
						}
					}
					else
					{
						if (c4 < '1' || c4 > '7')
						{
							continue;
						}
						num3 = array2[c2 - 49];
					}
					char c5 = array4[i][j + 1];
					bool flag4 = !char.IsDigit(c5);
					bool flag5 = flag4;
					if (flag5)
					{
						bool flag3;
						switch (c5)
						{
						default:
							flag3 = true;
							break;
						case 'A':
						case 'B':
						case 'C':
						case 'D':
						case 'E':
						case 'F':
						case 'a':
						case 'b':
						case 'c':
						case 'd':
						case 'e':
						case 'f':
							flag3 = false;
							break;
						}
						flag5 = flag3;
					}
					if (!flag5)
					{
						num3 += ((c5 >= '8') ? 1 : 0);
						int num4 = Convert.ToInt32(c5.ToString(), 16) & 7;
						num = ((num4 > num) ? num4 : num);
						list.Add((num3, item, num4));
					}
				}
				TuneList.Add(list);
			}
			AutoPlayCount = 0f;
			KeepTuneList.Clear();
			for (int k = 0; k < TuneList.Count + num; k++)
			{
				KeepTuneList.Add(new List<(int, bool, int)>());
			}
			IsAutoPlayOn = true;
		}

		public void DoAutoPlay()
		{
			ulong networkObjectId = ((NetworkBehaviour)Instruments4MusicPlugin.Player).NetworkObjectId;
			if (!IsAutoPlayOn)
			{
				return;
			}
			AutoPlayCount += Time.deltaTime;
			int num = (int)(AutoPlayCount / 0.5f * AutoPlaySpeed);
			num -= 4;
			if (num < 0)
			{
				return;
			}
			if (num >= TuneList.Count)
			{
				IsAutoPlayOn = false;
				return;
			}
			foreach (var item in TuneList[num])
			{
				var (noteNumber2, flag, num2) = item;
				if (KeepTuneList[num].All(((int, bool, int) tup) => tup.Item1 != noteNumber2))
				{
					PlayTunedAudioServerRpc(networkObjectId, noteNumber2, flag, newPulse: true, SecondaryTuneMethod);
					KeepTuneList[num].Add((noteNumber2, flag, 0));
				}
				if (num2 > 0 && TuneList[num + 1].All(((int, bool, int) tup) => tup.Item1 != noteNumber2) && KeepTuneList[num + 1].All(((int, bool, int) tup) => tup.Item1 != noteNumber2))
				{
					KeepTuneList[num + 1].Add((noteNumber2, flag, num2 - 1));
				}
			}
			foreach (var item2 in KeepTuneList[num])
			{
				var (noteNumber, flag2, num3) = item2;
				PlayTunedAudioServerRpc(networkObjectId, noteNumber, flag2, newPulse: false, SecondaryTuneMethod);
				if (num3 > 0 && TuneList[num + 1].All(((int, bool, int) tup) => tup.Item1 != noteNumber) && KeepTuneList[num + 1].All(((int, bool, int) tup) => tup.Item1 != noteNumber))
				{
					KeepTuneList[num + 1].Add((noteNumber, flag2, num3 - 1));
				}
			}
		}

		public static void AudioCountDown()
		{
			foreach (ulong key in _timerPlayerDictionary.Keys)
			{
				foreach (int key2 in _timerPlayerDictionary[key].Keys)
				{
					float num = _timerPlayerDictionary[key][key2];
					if (_tunedPlayerDictionary[key].TryGetValue(key2, out AudioSource value) && num >= 0f && value.volume > 0.01f)
					{
						if (IsSustaining.ContainsKey(key) && IsSustaining[key])
						{
							_timerPlayerDictionary[key][key2] = num - Time.deltaTime / SustainModifier;
							value.volume = (float)((double)value.volume * Math.Exp((0f - AttenuationCoeff) * Time.deltaTime / SustainModifier));
						}
						else
						{
							_timerPlayerDictionary[key][key2] = num - Time.deltaTime;
							value.volume = (float)((double)value.volume * Math.Exp((0f - AttenuationCoeff) * Time.deltaTime));
						}
					}
					else
					{
						if (value != null)
						{
							value.Stop();
						}
						_timerPlayerDictionary[key].Remove(key2, out var _);
					}
				}
			}
		}

		private static void EnableController()
		{
			try
			{
				if (!((Object)(object)Player == (Object)null))
				{
					Player.inTerminalMenu = false;
					Player.inSpecialInteractAnimation = false;
					Object.FindObjectOfType<Terminal>().timeSinceTerminalInUse = 0f;
					Instruments4MusicPlugin.AddLog("Trying to re-enable the controller.");
				}
			}
			catch (Exception arg)
			{
				Debug.LogError((object)$"Error while subscribing to input in PlayerController!: {arg}");
			}
		}

		private static void DisableController()
		{
			try
			{
				if (!((Object)(object)Player == (Object)null))
				{
					Player.inTerminalMenu = true;
					Player.inSpecialInteractAnimation = true;
					Instruments4MusicPlugin.AddLog("Trying to disable the controller.");
				}
			}
			catch (Exception arg)
			{
				Debug.LogError((object)$"Error while unsubscribing from input in PlayerController!: {arg}");
			}
		}

		public void Awake()
		{
			_tunedPlayerDictionary = new Dictionary<ulong, Dictionary<int, AudioSource>>();
			_timerPlayerDictionary = new Dictionary<ulong, ConcurrentDictionary<int, float>>();
			SecondaryTuneMethod = false;
			TheShowIsOn = false;
			SecondaryKeyBind = false;
			if (!KeyBindInit)
			{
				SetupKeyBindCallbacks();
				KeyBindInit = true;
			}
		}

		public void SetupKeyBindCallbacks()
		{
			Instruments4MusicPlugin.InputActionsInstance.SwitchTuneMethod.performed += OnSwitchTuneMethodPressed;
			Instruments4MusicPlugin.InputActionsInstance.Showtime.performed += OnShowtimePressed;
			Instruments4MusicPlugin.InputActionsInstance.CurtainCall.performed += OnCurtainCallPressed;
			Instruments4MusicPlugin.InputActionsInstance.ChangeMode.performed += OnChangeModePressed;
			Instruments4MusicPlugin.InputActionsInstance.InputNote.performed += OnInputNotePressed;
		}

		public void OnSwitchTuneMethodPressed(CallbackContext switchTuneMethodContext)
		{
			if (TheShowIsOn && ((CallbackContext)(ref switchTuneMethodContext)).performed)
			{
				SecondaryTuneMethod = !SecondaryTuneMethod;
				Instruments4MusicPlugin.AddLog($"Switch Tune Secondary {SecondaryTuneMethod}.");
			}
		}

		public void OnShowtimePressed(CallbackContext showtimeContext)
		{
			if (TheShowIsOn || !((CallbackContext)(ref showtimeContext)).performed)
			{
				return;
			}
			if (StationaryScript.IsLookingAtInstrument(out GameObject instrumentObj))
			{
				if (!((Object)(object)instrumentObj == (Object)null))
				{
					Instruments4MusicPlugin.AddLog("Looking at Stationary");
					(ulong, string)? tuple = FindNearestNetworkObject(instrumentObj);
					if (tuple.HasValue)
					{
						ulong item = tuple.Value.Item1;
						string item2 = tuple.Value.Item2;
						Instruments4MusicPlugin.AddLog("Try begin");
						Instruments4MusicPlugin.Stationary.LetShowBeginsServerRpc(((NetworkBehaviour)Instruments4MusicPlugin.Player).NetworkObjectId, item, item2);
						ActiveInstrument();
					}
				}
			}
			else if (PortableScript.IsHoldingInstrument(out instrumentObj) && !((Object)(object)instrumentObj == (Object)null))
			{
				Instruments4MusicPlugin.AddLog("Looking at Portable");
				NetworkObject component = instrumentObj.GetComponent<NetworkObject>();
				if ((Object)(object)component != (Object)null)
				{
					Instruments4MusicPlugin.AddLog("Try begin");
					Instruments4MusicPlugin.Portable.LetShowBeginsServerRpc(((NetworkBehaviour)Instruments4MusicPlugin.Player).NetworkObjectId, component.NetworkObjectId);
					ActiveInstrument();
				}
			}
		}

		private static (ulong, string)? FindNearestNetworkObject(GameObject current)
		{
			List<int> list = new List<int>();
			NetworkObject val = null;
			Transform val2 = current.transform;
			while ((Object)(object)val2 != (Object)null)
			{
				val = ((Component)val2).GetComponent<NetworkObject>();
				if ((Object)(object)val != (Object)null)
				{
					break;
				}
				int siblingIndex = val2.GetSiblingIndex();
				list.Insert(0, siblingIndex);
				val2 = val2.parent;
			}
			if ((Object)(object)val == (Object)null)
			{
				Instruments4MusicPlugin.AddLog("NetworkObject not found.");
				return null;
			}
			return (val.NetworkObjectId, string.Concat(list.Select((int i) => (char)(i + 65))));
		}

		public static GameObject? FindGameObjectFromPath(ulong objId, string pathSTR)
		{
			NetworkManager.Singleton.SpawnManager.SpawnedObjects.TryGetValue(objId, out var value);
			Transform val = ((Component)value).transform;
			List<int> list = new List<int>();
			foreach (char c in pathSTR)
			{
				int item = c - 65;
				list.Add(item);
			}
			foreach (int item2 in list)
			{
				if (item2 < 0 || item2 >= val.childCount)
				{
					Instruments4MusicPlugin.AddLog("GameObject not found.");
					return null;
				}
				val = val.GetChild(item2);
			}
			return ((Component)val).gameObject;
		}

		public void OnCurtainCallPressed(CallbackContext curtainCallContext)
		{
			if (TheShowIsOn && ((CallbackContext)(ref curtainCallContext)).performed)
			{
				Instruments4MusicPlugin.AddLog("Maybe next time.");
				DeActiveInstrument();
			}
		}

		public void OnChangeModePressed(CallbackContext changeModeContext)
		{
			if (TheShowIsOn && ((CallbackContext)(ref changeModeContext)).performed)
			{
				Instruments4MusicPlugin.AddLog("Change key bind mode.");
				SecondaryKeyBind = !SecondaryKeyBind;
				if (SecondaryKeyBind)
				{
					EnableController();
				}
				else
				{
					DisableController();
				}
				MusicHud.UpdateButtonTips();
			}
		}

		public void OnInputNotePressed(CallbackContext inputNoteContext)
		{
			if (TheShowIsOn && ((CallbackContext)(ref inputNoteContext)).performed)
			{
				Instruments4MusicPlugin.AddLog("Input music note.");
				MusicHud.Instance.TriggerInputNote();
			}
		}

		public void Update()
		{
			ulong networkObjectId = ((NetworkBehaviour)Instruments4MusicPlugin.Player).NetworkObjectId;
			if (_timerPlayerDictionary.ContainsKey(networkObjectId) && _timerPlayerDictionary[networkObjectId].Count > 0)
			{
				if (!IsAutoPlayOn)
				{
					IsSustaining[networkObjectId] = Instruments4MusicPlugin.InputActionsInstance.Sustain.ReadValue<float>() > 0.5f;
				}
				AudioCountDown();
			}
			if (!TheShowIsOn)
			{
				return;
			}
			if (IsAutoPlayOn)
			{
				DoAutoPlay();
			}
			int num = 0;
			InputAction? soft = Instruments4MusicPlugin.InputActionsInstance.Soft;
			bool flag = soft != null && soft.ReadValue<float>() > 0.5f;
			InputAction? semitone = Instruments4MusicPlugin.InputActionsInstance.Semitone;
			if (semitone != null && semitone.ReadValue<float>() > 0.5f && !SecondaryKeyBind)
			{
				num = 1;
			}
			if (SecondaryKeyBind)
			{
				InputAction lowCKey = Instruments4MusicPlugin.InputActionsInstance.LowCKey2;
				if (lowCKey != null && (lowCKey.ReadValue<float>() > 0.5f || lowCKey.triggered))
				{
					PlayTunedAudioServerRpc(networkObjectId, num, flag, lowCKey.triggered, SecondaryTuneMethod);
				}
				lowCKey = Instruments4MusicPlugin.InputActionsInstance.LowDKey2;
				if (lowCKey != null && (lowCKey.ReadValue<float>() > 0.5f || lowCKey.triggered))
				{
					PlayTunedAudioServerRpc(networkObjectId, 2 + num, flag, lowCKey.triggered, SecondaryTuneMethod);
				}
				lowCKey = Instruments4MusicPlugin.InputActionsInstance.LowEKey2;
				if (lowCKey != null && (lowCKey.ReadValue<float>() > 0.5f || lowCKey.triggered))
				{
					PlayTunedAudioServerRpc(networkObjectId, 4, flag, lowCKey.triggered, SecondaryTuneMethod);
				}
				lowCKey = Instruments4MusicPlugin.InputActionsInstance.LowFKey2;
				if (lowCKey != null && (lowCKey.ReadValue<float>() > 0.5f || lowCKey.triggered))
				{
					PlayTunedAudioServerRpc(networkObjectId, 5 + num, flag, lowCKey.triggered, SecondaryTuneMethod);
				}
				lowCKey = Instruments4MusicPlugin.InputActionsInstance.LowGKey2;
				if (lowCKey != null && (lowCKey.ReadValue<float>() > 0.5f || lowCKey.triggered))
				{
					PlayTunedAudioServerRpc(networkObjectId, 7 + num, flag, lowCKey.triggered, SecondaryTuneMethod);
				}
				lowCKey = Instruments4MusicPlugin.InputActionsInstance.LowAKey2;
				if (lowCKey != null && (lowCKey.ReadValue<float>() > 0.5f || lowCKey.triggered))
				{
					PlayTunedAudioServerRpc(networkObjectId, 9 + num, flag, lowCKey.triggered, SecondaryTuneMethod);
				}
				lowCKey = Instruments4MusicPlugin.InputActionsInstance.LowBKey2;
				if (lowCKey != null && (lowCKey.ReadValue<float>() > 0.5f || lowCKey.triggered))
				{
					PlayTunedAudioServerRpc(networkObjectId, 11, flag, lowCKey.triggered, SecondaryTuneMethod);
				}
				lowCKey = Instruments4MusicPlugin.InputActionsInstance.MidCKey2;
				if (lowCKey != null && (lowCKey.ReadValue<float>() > 0.5f || lowCKey.triggered))
				{
					PlayTunedAudioServerRpc(networkObjectId, 12 + num, flag, lowCKey.triggered, SecondaryTuneMethod);
				}
				lowCKey = Instruments4MusicPlugin.InputActionsInstance.MidDKey2;
				if (lowCKey != null && (lowCKey.ReadValue<float>() > 0.5f || lowCKey.triggered))
				{
					PlayTunedAudioServerRpc(networkObjectId, 14 + num, flag, lowCKey.triggered, SecondaryTuneMethod);
				}
				lowCKey = Instruments4MusicPlugin.InputActionsInstance.MidEKey2;
				if (lowCKey != null && (lowCKey.ReadValue<float>() > 0.5f || lowCKey.triggered))
				{
					PlayTunedAudioServerRpc(networkObjectId, 16, flag, lowCKey.triggered, SecondaryTuneMethod);
				}
				lowCKey = Instruments4MusicPlugin.InputActionsInstance.MidFKey2;
				if (lowCKey != null && (lowCKey.ReadValue<float>() > 0.5f || lowCKey.triggered))
				{
					PlayTunedAudioServerRpc(networkObjectId, 17 + num, flag, lowCKey.triggered, SecondaryTuneMethod);
				}
				lowCKey = Instruments4MusicPlugin.InputActionsInstance.MidGKey2;
				if (lowCKey != null && (lowCKey.ReadValue<float>() > 0.5f || lowCKey.triggered))
				{
					PlayTunedAudioServerRpc(networkObjectId, 19 + num, flag, lowCKey.triggered, SecondaryTuneMethod);
				}
				lowCKey = Instruments4MusicPlugin.InputActionsInstance.MidAKey2;
				if (lowCKey != null && (lowCKey.ReadValue<float>() > 0.5f || lowCKey.triggered))
				{
					PlayTun