Decompiled source of Paroxysm V01 v1.0.1

plugins/CustomGrabColour.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Threading.Tasks;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using CustomGrabColour.Config;
using CustomGrabColour.PlayerGrabBeam;
using HarmonyLib;
using MenuLib;
using MenuLib.MonoBehaviors;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using UnityEngine;
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("Assembly-CSharp-firstpass")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: IgnoresAccessChecksTo("Autodesk.Fbx")]
[assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")]
[assembly: IgnoresAccessChecksTo("FbxBuildTestAssets")]
[assembly: IgnoresAccessChecksTo("Klattersynth")]
[assembly: IgnoresAccessChecksTo("Photon3Unity3D")]
[assembly: IgnoresAccessChecksTo("PhotonChat")]
[assembly: IgnoresAccessChecksTo("PhotonRealtime")]
[assembly: IgnoresAccessChecksTo("PhotonUnityNetworking")]
[assembly: IgnoresAccessChecksTo("PhotonUnityNetworking.Utilities")]
[assembly: IgnoresAccessChecksTo("PhotonVoice.API")]
[assembly: IgnoresAccessChecksTo("PhotonVoice")]
[assembly: IgnoresAccessChecksTo("PhotonVoice.PUN")]
[assembly: IgnoresAccessChecksTo("SingularityGroup.HotReload.Runtime")]
[assembly: IgnoresAccessChecksTo("SingularityGroup.HotReload.Runtime.Public")]
[assembly: IgnoresAccessChecksTo("Sirenix.OdinInspector.Attributes")]
[assembly: IgnoresAccessChecksTo("Sirenix.Serialization.Config")]
[assembly: IgnoresAccessChecksTo("Sirenix.Serialization")]
[assembly: IgnoresAccessChecksTo("Sirenix.Utilities")]
[assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")]
[assembly: IgnoresAccessChecksTo("Unity.Formats.Fbx.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")]
[assembly: IgnoresAccessChecksTo("Unity.Postprocessing.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")]
[assembly: IgnoresAccessChecksTo("Unity.Timeline")]
[assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Antlr3.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Core")]
[assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Flow")]
[assembly: IgnoresAccessChecksTo("Unity.VisualScripting.State")]
[assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.UI")]
[assembly: IgnoresAccessChecksTo("websocket-sharp")]
[assembly: AssemblyCompany("Enchanted_Games")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("2.2.0.0")]
[assembly: AssemblyInformationalVersion("2.2.0+fbbbd91b05114a40601b8f1c56741df7998c23bd")]
[assembly: AssemblyProduct("CustomGrabColour")]
[assembly: AssemblyTitle("CustomGrabColour")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("2.2.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.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 CustomGrabColour
{
	public static class PluginInfo
	{
		public const string PluginID = "CustomGrabColour";

		public const string PluginName = "CustomGrabColour";

		public const string PluginVersion = "2.2.0";

		public const string PluginGuid = "games.enchanted.CustomGrabColour";
	}
	[BepInPlugin("games.enchanted.CustomGrabColour", "CustomGrabColour", "2.2.0")]
	public class Plugin : BaseUnityPlugin
	{
		private ManualLogSource _pluginLogger;

		public static Plugin Instance { get; private set; }

		public static void LogMessageIfDebug(object message)
		{
			if (CustomGrabColourConfig.EnableDebugLogs.Value)
			{
				Instance._pluginLogger.LogMessage((object)("CustomGrabColour Debug: " + message));
			}
		}

		public static void LogMessage(object message)
		{
			Instance._pluginLogger.LogMessage((object)("CustomGrabColour: " + message));
		}

		public static void LogError(object message)
		{
			Instance._pluginLogger.LogError((object)("CustomGrabColour Debug: " + message));
		}

		public static void LogErrorIfDebug(object message)
		{
			if (CustomGrabColourConfig.EnableDebugLogs.Value)
			{
				Instance._pluginLogger.LogError((object)("CustomGrabColour: " + message));
			}
		}

		public static void LogWarning(object message)
		{
			Instance._pluginLogger.LogWarning((object)("CustomGrabColour: " + message));
		}

		private void Awake()
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Expected O, but got Unknown
			Instance = this;
			_pluginLogger = ((BaseUnityPlugin)this).Logger;
			_pluginLogger.LogInfo((object)"Loading plugin CustomGrabColour! (games.enchanted.CustomGrabColour)");
			CustomGrabColourConfig.Init(((BaseUnityPlugin)this).Config);
			Harmony val = new Harmony("games.enchanted.CustomGrabColour");
			val.PatchAll();
			ConfigMenu.Init();
			_pluginLogger.LogInfo((object)"Loading finished for CustomGrabColour! (games.enchanted.CustomGrabColour)");
		}
	}
}
namespace CustomGrabColour.PlayerGrabBeam
{
	public class CustomGrabBeamColour : MonoBehaviour, IPunObservable
	{
		internal static GrabBeamColourSettings LocalNeutralColour;

		internal static GrabBeamColourSettings LocalHealingColour;

		internal static GrabBeamColourSettings LocalRotatingColour;

		internal GrabBeamColourSettings CurrentNeutralColour;

		internal GrabBeamColourSettings CurrentHealingColour;

		internal GrabBeamColourSettings CurrentRotatingColour;

		internal bool SentInitialColourUpdate = false;

		public PlayerAvatar player;

		private Material _bodyMaterialInternal;

		public Material BodyMaterial
		{
			get
			{
				//IL_0042: Unknown result type (might be due to invalid IL or missing references)
				//IL_004c: Expected O, but got Unknown
				if ((Object)(object)_bodyMaterialInternal == (Object)null)
				{
					try
					{
						FieldInfo field = ((object)player.playerHealth).GetType().GetField("bodyMaterial", BindingFlags.Instance | BindingFlags.NonPublic);
						_bodyMaterialInternal = (Material)field.GetValue(player.playerHealth);
					}
					catch (Exception)
					{
						Plugin.LogMessageIfDebug("Failed to get value of PlayerHealth bodyMaterial field");
						return null;
					}
				}
				return _bodyMaterialInternal;
			}
			set
			{
				_bodyMaterialInternal = value;
			}
		}

		public static GrabBeamColourSettings LocalBeamColour
		{
			get
			{
				throw new NotImplementedException("Tried to get field LocalBeamColour, call GetLocalSettingsForBeamType instead");
			}
			set
			{
				switch (value.CurrentBeamType)
				{
				case GrabBeamColourSettings.BeamType.Neutral:
					LocalNeutralColour = value;
					break;
				case GrabBeamColourSettings.BeamType.Heal:
					LocalHealingColour = value;
					break;
				case GrabBeamColourSettings.BeamType.Rotate:
					LocalRotatingColour = value;
					break;
				}
			}
		}

		public GrabBeamColourSettings CurrentBeamColour
		{
			get
			{
				throw new NotImplementedException("Tried to get field CurrentBeamColour, call GetSettingsForBeamType instead");
			}
			set
			{
				switch (value.CurrentBeamType)
				{
				case GrabBeamColourSettings.BeamType.Neutral:
					CurrentNeutralColour = value;
					break;
				case GrabBeamColourSettings.BeamType.Heal:
					CurrentHealingColour = value;
					break;
				case GrabBeamColourSettings.BeamType.Rotate:
					CurrentRotatingColour = value;
					break;
				}
			}
		}

		public static GrabBeamColourSettings GetLocalSettingsForBeamType(GrabBeamColourSettings.BeamType beamType)
		{
			return beamType switch
			{
				GrabBeamColourSettings.BeamType.Heal => LocalHealingColour, 
				GrabBeamColourSettings.BeamType.Rotate => LocalRotatingColour, 
				_ => LocalNeutralColour, 
			};
		}

		public GrabBeamColourSettings GetSettingsForBeamType(GrabBeamColourSettings.BeamType beamType)
		{
			return beamType switch
			{
				GrabBeamColourSettings.BeamType.Heal => CurrentNeutralColour, 
				GrabBeamColourSettings.BeamType.Rotate => CurrentHealingColour, 
				_ => CurrentRotatingColour, 
			};
		}

		private void Awake()
		{
			player = ((Component)this).gameObject.GetComponent<PlayerAvatar>();
		}

		public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
		{
			throw new NotImplementedException();
		}

		public static void SaveLocalColoursToConfig()
		{
			CustomGrabColourConfig.SaveColour(LocalNeutralColour);
			CustomGrabColourConfig.SaveColour(LocalHealingColour);
			CustomGrabColourConfig.SaveColour(LocalRotatingColour);
		}

		public static void ResetBeamColours()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			LocalNeutralColour = new GrabBeamColourSettings(CustomGrabColourConfig.NeutralDefaultColour, (bool)((ConfigEntryBase)CustomGrabColourConfig.NeutralGrabBeam.MatchSkin).DefaultValue, GrabBeamColourSettings.BeamType.Neutral);
			LocalHealingColour = new GrabBeamColourSettings(CustomGrabColourConfig.HealingDefaultColour, (bool)((ConfigEntryBase)CustomGrabColourConfig.HealingGrabBeam.MatchSkin).DefaultValue, GrabBeamColourSettings.BeamType.Heal);
			LocalRotatingColour = new GrabBeamColourSettings(CustomGrabColourConfig.RotatingDefaultColour, (bool)((ConfigEntryBase)CustomGrabColourConfig.RotatingGrabBeam.MatchSkin).DefaultValue, GrabBeamColourSettings.BeamType.Rotate);
			UpdateBeamColourForAllBeams();
		}

		public static void UpdateBeamColour(GrabBeamColourSettings newColour)
		{
			newColour.a = Mathf.Clamp(newColour.a, 0f, 0.5f);
			LocalBeamColour = newColour;
			UpdateBeamColour(newColour.CurrentBeamType);
		}

		public static void UpdateBeamColourForAllBeams()
		{
			foreach (GrabBeamColourSettings.BeamType value in Enum.GetValues(typeof(GrabBeamColourSettings.BeamType)))
			{
				UpdateBeamColour(value);
			}
		}

		public static void UpdateBeamColour(GrabBeamColourSettings.BeamType beamType)
		{
			GrabBeamColourSettings localSettingsForBeamType = GetLocalSettingsForBeamType(beamType);
			if (GameManager.Multiplayer())
			{
				PlayerAvatar.instance.photonView.RPC("SetBeamColourRPC", (RpcTarget)3, GrabBeamColourSettings.ToRPCBuffer(localSettingsForBeamType));
			}
			else
			{
				((Component)PlayerAvatar.instance).GetComponent<CustomGrabBeamColour>().SetBeamColourRPC(GrabBeamColourSettings.ToRPCBuffer(localSettingsForBeamType));
			}
		}

		[PunRPC]
		public void SetBeamColourRPC(object[] beamColourParts)
		{
			GrabBeamColourSettings currentBeamColour = GrabBeamColourSettings.FromRPCBuffer(beamColourParts);
			Plugin.LogMessageIfDebug("SetBeamColourRPC called with values: r:" + currentBeamColour.r + ", g:" + currentBeamColour.g + ", b:" + currentBeamColour.b + ", a:" + currentBeamColour.a + ", matchSkin:" + currentBeamColour.MatchSkin + ", beamType:" + currentBeamColour.CurrentBeamType);
			currentBeamColour.a = Mathf.Clamp(currentBeamColour.a, 0f, 0.5f);
			CurrentBeamColour = currentBeamColour;
			if (currentBeamColour.CurrentBeamType != 0)
			{
				return;
			}
			Type type = ((object)player.physGrabber).GetType();
			try
			{
				FieldInfo field = type.GetField("prevColorState", BindingFlags.Instance | BindingFlags.NonPublic);
				if (field != null)
				{
					field.SetValue(player.physGrabber, -1);
				}
			}
			catch (Exception ex)
			{
				Plugin.LogErrorIfDebug("Error while setting field 'prevColorState', this is probably harmless.\n" + ex);
			}
			try
			{
				MethodInfo method = type.GetMethod("ColorStates", BindingFlags.Instance | BindingFlags.NonPublic);
				if (method != null)
				{
					method.Invoke(player.physGrabber, null);
				}
			}
			catch (Exception ex2)
			{
				Plugin.LogErrorIfDebug("Error while calling method 'ColorStates', this is probably harmless.\n" + ex2);
			}
		}

		public Color GetBodyColour(Color fallbackColour)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			Color color = BodyMaterial.GetColor(Shader.PropertyToID("_AlbedoColor"));
			bool flag = false;
			return color;
		}

		public static Color GetLocalBodyColour(Color fallbackColour)
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Expected O, but got Unknown
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			Color color;
			try
			{
				FieldInfo field = ((object)PlayerAvatar.instance.playerHealth).GetType().GetField("bodyMaterial", BindingFlags.Instance | BindingFlags.NonPublic);
				Material val = (Material)field.GetValue(PlayerAvatar.instance.playerHealth);
				color = val.GetColor(Shader.PropertyToID("_AlbedoColor"));
			}
			catch (Exception)
			{
				Plugin.LogMessageIfDebug("Failed to get value of PlayerHealth bodyMaterial field in GetLocalBodyColour");
				return fallbackColour;
			}
			bool flag = false;
			return color;
		}
	}
	public struct GrabBeamColourSettings
	{
		public enum BeamType : byte
		{
			Neutral,
			Heal,
			Rotate
		}

		public Color Colour;

		public bool MatchSkin;

		public readonly BeamType CurrentBeamType;

		public float r
		{
			get
			{
				return Colour.r;
			}
			set
			{
				Colour.r = value;
			}
		}

		public float g
		{
			get
			{
				return Colour.g;
			}
			set
			{
				Colour.g = value;
			}
		}

		public float b
		{
			get
			{
				return Colour.b;
			}
			set
			{
				Colour.b = value;
			}
		}

		public float a
		{
			get
			{
				return Colour.a;
			}
			set
			{
				Colour.a = value;
			}
		}

		public GrabBeamColourSettings(Color colour, bool matchSkin, BeamType currentBeamType)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			Colour = colour;
			MatchSkin = matchSkin;
			CurrentBeamType = currentBeamType;
		}

		public static object[] ToRPCBuffer(GrabBeamColourSettings beamColour)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			Color colour = beamColour.Colour;
			return new object[6]
			{
				colour.r,
				colour.g,
				colour.b,
				colour.a,
				beamColour.MatchSkin,
				(byte)beamColour.CurrentBeamType
			};
		}

		public static GrabBeamColourSettings FromRPCBuffer(object[] rpcBuffer)
		{
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			if (!(rpcBuffer[0] is float) || !(rpcBuffer[1] is float) || !(rpcBuffer[2] is float) || !(rpcBuffer[3] is float) || !(rpcBuffer[4] is bool) || !(rpcBuffer[5] is byte))
			{
				throw new ArgumentException("FromRPCBuffer recieved incorrect parameters");
			}
			Color colour = default(Color);
			((Color)(ref colour))..ctor((float)rpcBuffer[0], (float)rpcBuffer[1], (float)rpcBuffer[2], (float)rpcBuffer[3]);
			return new GrabBeamColourSettings(colour, (bool)rpcBuffer[4], (BeamType)rpcBuffer[5]);
		}
	}
	public static class GrabBeamUtil
	{
		private static void TrySendBeamColourUpdate(PlayerAvatar player, GrabBeamColourSettings.BeamType beamType)
		{
			CustomGrabBeamColour component = ((Component)player).GetComponent<CustomGrabBeamColour>();
			if ((Object)(object)component != (Object)null)
			{
				CustomGrabBeamColour.UpdateBeamColour(beamType);
			}
		}

		public static void TrySendBeamColourUpdateForAllBeams(PlayerAvatar player)
		{
			foreach (GrabBeamColourSettings.BeamType value in Enum.GetValues(typeof(GrabBeamColourSettings.BeamType)))
			{
				TrySendBeamColourUpdate(player, value);
			}
		}
	}
}
namespace CustomGrabColour.Patch
{
	internal abstract class PhysGrabberPatches
	{
		[HarmonyPatch(typeof(PhysGrabber))]
		[HarmonyPatch("ColorStateSetColor")]
		private class PhysGrabber_ColorState_Patch
		{
			private static readonly FieldRef<PhysGrabber, int> PrevColorStateRef = AccessTools.FieldRefAccess<PhysGrabber, int>("prevColorState");

			private static void Prefix(PhysGrabber __instance, ref Color mainColor, ref Color emissionColor)
			{
				//IL_00be: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
				//IL_009c: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a6: 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_00c6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
				//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
				//IL_0108: 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_012c: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
				int num = PrevColorStateRef.Invoke(__instance);
				bool flag = false;
				CustomGrabBeamColour currentGrabBeamColour = GetCurrentGrabBeamColour(__instance);
				if (!Object.op_Implicit((Object)(object)currentGrabBeamColour))
				{
					Plugin.LogMessageIfDebug("Player has no custom beam colour");
					ResetRotateBeamGridsColour(__instance);
					return;
				}
				GrabBeamColourSettings grabBeamColourSettings;
				switch (num)
				{
				case 0:
					grabBeamColourSettings = currentGrabBeamColour.CurrentNeutralColour;
					break;
				case 1:
					grabBeamColourSettings = currentGrabBeamColour.CurrentHealingColour;
					break;
				case 2:
					grabBeamColourSettings = currentGrabBeamColour.CurrentRotatingColour;
					break;
				default:
					ResetRotateBeamGridsColour(__instance);
					return;
				}
				Color val;
				if (grabBeamColourSettings.MatchSkin)
				{
					val = currentGrabBeamColour.GetBodyColour(grabBeamColourSettings.Colour);
					val.a = grabBeamColourSettings.Colour.a;
				}
				else
				{
					val = grabBeamColourSettings.Colour;
				}
				mainColor.r = val.r / 3.5f;
				mainColor.g = val.g / 4f;
				mainColor.b = val.b / 3.5f;
				mainColor.a = val.a;
				emissionColor.r = val.r / 3.5f;
				emissionColor.g = val.g / 4f;
				emissionColor.b = val.b / 3.5f;
				emissionColor.a = 0.3f;
				Plugin.LogMessageIfDebug("Set player beam to: (" + mainColor.r + ", " + mainColor.g + ", " + mainColor.b + ", " + mainColor.a + "). colour state is " + num);
				SetRotateBeamGridsColour(__instance, val);
			}
		}

		[HarmonyPatch(typeof(PhysGrabber))]
		[HarmonyPatch("ChangeBeamAlpha")]
		private class PhysGrabber_ChangeBeamAlpha_Patch
		{
			private static bool Prefix()
			{
				return false;
			}
		}

		[HarmonyPatch(typeof(PhysGrabber))]
		[HarmonyPatch("PhysGrabBeamActivate")]
		private class PhysGrabber_PhysGrabBeamActivate_Patch
		{
			private static async void Prefix(PhysGrabber __instance)
			{
				CustomGrabBeamColour grabBeamColour = GetCurrentGrabBeamColour(__instance);
				if (!grabBeamColour.SentInitialColourUpdate)
				{
					bool grabBeamActive = true;
					try
					{
						FieldInfo grabBeamActiveField = ((object)__instance).GetType().GetField("physGrabBeamActive", BindingFlags.Instance | BindingFlags.NonPublic);
						grabBeamActive = (bool)grabBeamActiveField.GetValue(__instance);
					}
					catch (Exception)
					{
						Plugin.LogMessageIfDebug("Failed to get value of PhysGrabber physGrabBeamActive field");
					}
					if (!grabBeamActive)
					{
						await Task.Delay(100);
						Plugin.LogMessageIfDebug("PhysGrabBeamActivate called");
						GrabBeamUtil.TrySendBeamColourUpdateForAllBeams(__instance.playerAvatar);
						grabBeamColour.SentInitialColourUpdate = true;
					}
				}
			}
		}

		private static readonly FieldRef<PhysGrabber, List<GameObject>> PhysGrabPointVisualGridObjectsRef = AccessTools.FieldRefAccess<PhysGrabber, List<GameObject>>("physGrabPointVisualGridObjects");

		private static readonly int EmissionColor = Shader.PropertyToID("_EmissionColor");

		private static CustomGrabBeamColour GetCurrentGrabBeamColour(PhysGrabber grabber)
		{
			return ((Component)grabber.playerAvatar).gameObject.GetComponent<CustomGrabBeamColour>();
		}

		private static void ResetRotateBeamGridsColour(PhysGrabber __instance)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			SetRotateBeamGridsColour(__instance, CustomGrabColourConfig.RotatingDefaultColour);
		}

		private static void SetRotateBeamGridsColour(PhysGrabber __instance, Color gridColour)
		{
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: 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_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			List<GameObject> list = PhysGrabPointVisualGridObjectsRef.Invoke(__instance);
			Color color = default(Color);
			Color val = default(Color);
			foreach (GameObject item in list)
			{
				Material material = ((Renderer)item.GetComponent<MeshRenderer>()).material;
				if (Object.op_Implicit((Object)(object)material))
				{
					((Color)(ref color))..ctor(gridColour.r / 3.5f, gridColour.g / 4f, gridColour.b / 3.5f, gridColour.a);
					material.color = color;
					((Color)(ref val))..ctor(gridColour.r / 3.5f, gridColour.g / 4f, gridColour.b / 3.5f, 0.3f);
					material.SetColor(EmissionColor, val);
					Plugin.LogMessageIfDebug("Set grid mesh to: (" + material.color.r + ", " + material.color.g + ", " + material.color.b + ", " + material.color.a + ")");
				}
			}
		}
	}
	internal abstract class PlayerAvatarPatches
	{
		[HarmonyPatch(typeof(PlayerAvatar))]
		[HarmonyPatch("Awake")]
		private class PlayerAvatar_Awake_Patch
		{
			public static void Postfix(PlayerAvatar __instance)
			{
				((Component)__instance).gameObject.AddComponent<CustomGrabBeamColour>();
			}
		}

		[HarmonyPatch(typeof(PlayerAvatar))]
		[HarmonyPatch("PlayerAvatarSetColor")]
		private class PlayerAvatar_PlayerAvatarSetColor_Patch
		{
			public static void Postfix(PlayerAvatar __instance, int colorIndex)
			{
				GrabBeamUtil.TrySendBeamColourUpdateForAllBeams(__instance);
			}
		}
	}
}
namespace CustomGrabColour.Config
{
	internal static class ConfigMenu
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static BuilderDelegate <>9__7_0;

			public static BuilderDelegate <>9__7_1;

			public static BuilderDelegate <>9__7_2;

			public static BuilderDelegate <>9__8_0;

			public static ScrollViewBuilderDelegate <>9__8_1;

			public static Action<float> <>9__8_20;

			public static ScrollViewBuilderDelegate <>9__8_2;

			public static Action<float> <>9__8_21;

			public static ScrollViewBuilderDelegate <>9__8_3;

			public static Action<float> <>9__8_22;

			public static ScrollViewBuilderDelegate <>9__8_4;

			public static Action<float> <>9__8_23;

			public static ScrollViewBuilderDelegate <>9__8_5;

			public static Action<bool> <>9__8_24;

			public static ScrollViewBuilderDelegate <>9__8_6;

			public static ScrollViewBuilderDelegate <>9__8_7;

			public static Action<float> <>9__8_25;

			public static ScrollViewBuilderDelegate <>9__8_8;

			public static Action<float> <>9__8_26;

			public static ScrollViewBuilderDelegate <>9__8_9;

			public static Action<float> <>9__8_27;

			public static ScrollViewBuilderDelegate <>9__8_10;

			public static Action<float> <>9__8_28;

			public static ScrollViewBuilderDelegate <>9__8_11;

			public static Action<bool> <>9__8_29;

			public static ScrollViewBuilderDelegate <>9__8_12;

			public static ScrollViewBuilderDelegate <>9__8_13;

			public static Action<float> <>9__8_30;

			public static ScrollViewBuilderDelegate <>9__8_14;

			public static Action<float> <>9__8_31;

			public static ScrollViewBuilderDelegate <>9__8_15;

			public static Action<float> <>9__8_32;

			public static ScrollViewBuilderDelegate <>9__8_16;

			public static Action<float> <>9__8_33;

			public static ScrollViewBuilderDelegate <>9__8_17;

			public static Action<bool> <>9__8_34;

			public static ScrollViewBuilderDelegate <>9__8_18;

			internal void <Init>b__7_0(Transform parent)
			{
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				MenuAPI.CreateREPOButton("Change Grab Colour", (Action)OpenPopup, parent, new Vector2(28.3f, 350f));
			}

			internal void <Init>b__7_1(Transform parent)
			{
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				MenuAPI.CreateREPOButton("Change Grab Colour", (Action)OpenPopup, parent, new Vector2(28.3f, 350f));
			}

			internal void <Init>b__7_2(Transform parent)
			{
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				MenuAPI.CreateREPOButton("Change Grab Colour", (Action)OpenPopup, parent, new Vector2(28.3f, 350f));
			}

			internal void <OpenPopup>b__8_0(Transform parent)
			{
				//IL_001a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0035: Unknown result type (might be due to invalid IL or missing references)
				//IL_003a: Unknown result type (might be due to invalid IL or missing references)
				//IL_008f: 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_0060: Unknown result type (might be due to invalid IL or missing references)
				//IL_0106: Unknown result type (might be due to invalid IL or missing references)
				//IL_0123: Unknown result type (might be due to invalid IL or missing references)
				//IL_0128: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
				//IL_014f: Unknown result type (might be due to invalid IL or missing references)
				float verticalPos = GetVerticalPos(0);
				REPOLabel val = MenuAPI.CreateREPOLabel("Neutral Colour Preview", parent, new Vector2(452f, verticalPos - 60f));
				((Component)val).transform.localScale = Vector2.op_Implicit(new Vector2(0.5f, 0.5f));
				if (!Object.op_Implicit((Object)(object)_neutralGrabColourPreviewParent))
				{
					CreateBeamPreviewColourRectangle(parent, new Vector2(515f, verticalPos), out _neutralGrabColourPreviewParent, out _neutralGrabColourPreviewImage);
				}
				float verticalPos2 = GetVerticalPos(1);
				REPOLabel val2 = MenuAPI.CreateREPOLabel("Rotating Colour Preview", parent, new Vector2(452f, verticalPos2 - 60f));
				((Component)val2).transform.localScale = Vector2.op_Implicit(new Vector2(0.5f, 0.5f));
				if (!Object.op_Implicit((Object)(object)_rotatingGrabColourPreviewParent))
				{
					CreateBeamPreviewColourRectangle(parent, new Vector2(515f, verticalPos2), out _rotatingGrabColourPreviewParent, out _rotatingGrabColourPreviewImage);
				}
				float verticalPos3 = GetVerticalPos(2);
				REPOLabel val3 = MenuAPI.CreateREPOLabel("Healing Colour Preview", parent, new Vector2(452f, verticalPos3 - 60f));
				((Component)val3).transform.localScale = Vector2.op_Implicit(new Vector2(0.5f, 0.5f));
				if (!Object.op_Implicit((Object)(object)_healingGrabColourPreviewParent))
				{
					CreateBeamPreviewColourRectangle(parent, new Vector2(515f, verticalPos3), out _healingGrabColourPreviewParent, out _healingGrabColourPreviewImage);
				}
			}

			internal RectTransform <OpenPopup>b__8_1(Transform parent)
			{
				//IL_0012: Unknown result type (might be due to invalid IL or missing references)
				//IL_002d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0032: Unknown result type (might be due to invalid IL or missing references)
				REPOLabel val = MenuAPI.CreateREPOLabel("Neutral Beam Colour", parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(0)));
				((Component)val).transform.localScale = Vector2.op_Implicit(new Vector2(0.5f, 0.5f));
				return ((REPOElement)val).rectTransform;
			}

			internal RectTransform <OpenPopup>b__8_2(Transform parent)
			{
				//IL_0045: Unknown result type (might be due to invalid IL or missing references)
				REPOSlider val = CreateColourSlider("Red", "", delegate(float f)
				{
					//IL_0022: Unknown result type (might be due to invalid IL or missing references)
					//IL_0027: Unknown result type (might be due to invalid IL or missing references)
					//IL_0035: Unknown result type (might be due to invalid IL or missing references)
					CustomGrabBeamColour.LocalNeutralColour.r = f;
					if (!CustomGrabBeamColour.LocalNeutralColour.MatchSkin)
					{
						Color color = ((Graphic)_neutralGrabColourPreviewImage).color;
						color.r = f;
						((Graphic)_neutralGrabColourPreviewImage).color = color;
					}
				}, CustomGrabBeamColour.LocalNeutralColour.r, 1f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(1)));
				return ((REPOElement)val).rectTransform;
			}

			internal void <OpenPopup>b__8_20(float f)
			{
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				//IL_0035: Unknown result type (might be due to invalid IL or missing references)
				CustomGrabBeamColour.LocalNeutralColour.r = f;
				if (!CustomGrabBeamColour.LocalNeutralColour.MatchSkin)
				{
					Color color = ((Graphic)_neutralGrabColourPreviewImage).color;
					color.r = f;
					((Graphic)_neutralGrabColourPreviewImage).color = color;
				}
			}

			internal RectTransform <OpenPopup>b__8_3(Transform parent)
			{
				//IL_0045: Unknown result type (might be due to invalid IL or missing references)
				REPOSlider val = CreateColourSlider("Green", "", delegate(float f)
				{
					//IL_0022: Unknown result type (might be due to invalid IL or missing references)
					//IL_0027: Unknown result type (might be due to invalid IL or missing references)
					//IL_0035: Unknown result type (might be due to invalid IL or missing references)
					CustomGrabBeamColour.LocalNeutralColour.g = f;
					if (!CustomGrabBeamColour.LocalNeutralColour.MatchSkin)
					{
						Color color = ((Graphic)_neutralGrabColourPreviewImage).color;
						color.g = f;
						((Graphic)_neutralGrabColourPreviewImage).color = color;
					}
				}, CustomGrabBeamColour.LocalNeutralColour.g, 1f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(2)));
				return ((REPOElement)val).rectTransform;
			}

			internal void <OpenPopup>b__8_21(float f)
			{
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				//IL_0035: Unknown result type (might be due to invalid IL or missing references)
				CustomGrabBeamColour.LocalNeutralColour.g = f;
				if (!CustomGrabBeamColour.LocalNeutralColour.MatchSkin)
				{
					Color color = ((Graphic)_neutralGrabColourPreviewImage).color;
					color.g = f;
					((Graphic)_neutralGrabColourPreviewImage).color = color;
				}
			}

			internal RectTransform <OpenPopup>b__8_4(Transform parent)
			{
				//IL_0045: Unknown result type (might be due to invalid IL or missing references)
				REPOSlider val = CreateColourSlider("Blue", "", delegate(float f)
				{
					//IL_0022: Unknown result type (might be due to invalid IL or missing references)
					//IL_0027: Unknown result type (might be due to invalid IL or missing references)
					//IL_0035: Unknown result type (might be due to invalid IL or missing references)
					CustomGrabBeamColour.LocalNeutralColour.b = f;
					if (!CustomGrabBeamColour.LocalNeutralColour.MatchSkin)
					{
						Color color = ((Graphic)_neutralGrabColourPreviewImage).color;
						color.b = f;
						((Graphic)_neutralGrabColourPreviewImage).color = color;
					}
				}, CustomGrabBeamColour.LocalNeutralColour.b, 1f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(3)));
				return ((REPOElement)val).rectTransform;
			}

			internal void <OpenPopup>b__8_22(float f)
			{
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				//IL_0035: Unknown result type (might be due to invalid IL or missing references)
				CustomGrabBeamColour.LocalNeutralColour.b = f;
				if (!CustomGrabBeamColour.LocalNeutralColour.MatchSkin)
				{
					Color color = ((Graphic)_neutralGrabColourPreviewImage).color;
					color.b = f;
					((Graphic)_neutralGrabColourPreviewImage).color = color;
				}
			}

			internal RectTransform <OpenPopup>b__8_5(Transform parent)
			{
				//IL_0045: Unknown result type (might be due to invalid IL or missing references)
				REPOSlider val = CreateColourSlider("Opacity", "", delegate(float f)
				{
					//IL_0012: Unknown result type (might be due to invalid IL or missing references)
					//IL_0017: Unknown result type (might be due to invalid IL or missing references)
					//IL_0025: Unknown result type (might be due to invalid IL or missing references)
					CustomGrabBeamColour.LocalNeutralColour.a = f;
					Color color = ((Graphic)_neutralGrabColourPreviewImage).color;
					color.a = f;
					((Graphic)_neutralGrabColourPreviewImage).color = color;
				}, CustomGrabBeamColour.LocalNeutralColour.a, 0.5f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(4)));
				return ((REPOElement)val).rectTransform;
			}

			internal void <OpenPopup>b__8_23(float f)
			{
				//IL_0012: Unknown result type (might be due to invalid IL or missing references)
				//IL_0017: Unknown result type (might be due to invalid IL or missing references)
				//IL_0025: Unknown result type (might be due to invalid IL or missing references)
				CustomGrabBeamColour.LocalNeutralColour.a = f;
				Color color = ((Graphic)_neutralGrabColourPreviewImage).color;
				color.a = f;
				((Graphic)_neutralGrabColourPreviewImage).color = color;
			}

			internal RectTransform <OpenPopup>b__8_6(Transform parent)
			{
				//IL_0031: Unknown result type (might be due to invalid IL or missing references)
				REPOToggle val2 = MenuAPI.CreateREPOToggle("Match Skin Colour", (Action<bool>)delegate(bool val)
				{
					CustomGrabBeamColour.LocalNeutralColour.MatchSkin = val;
					HandleNeutralSkinMatchChange();
				}, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(5)), "Yes", "No", CustomGrabBeamColour.LocalNeutralColour.MatchSkin);
				return ((REPOElement)val2).rectTransform;
			}

			internal void <OpenPopup>b__8_24(bool val)
			{
				CustomGrabBeamColour.LocalNeutralColour.MatchSkin = val;
				HandleNeutralSkinMatchChange();
			}

			internal RectTransform <OpenPopup>b__8_7(Transform parent)
			{
				//IL_0012: Unknown result type (might be due to invalid IL or missing references)
				//IL_002d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0032: Unknown result type (might be due to invalid IL or missing references)
				REPOLabel val = MenuAPI.CreateREPOLabel("Rotating Beam Colour", parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(6)));
				((Component)val).transform.localScale = Vector2.op_Implicit(new Vector2(0.5f, 0.5f));
				return ((REPOElement)val).rectTransform;
			}

			internal RectTransform <OpenPopup>b__8_8(Transform parent)
			{
				//IL_0045: Unknown result type (might be due to invalid IL or missing references)
				REPOSlider val = CreateColourSlider("Red", "", delegate(float f)
				{
					//IL_0022: Unknown result type (might be due to invalid IL or missing references)
					//IL_0027: Unknown result type (might be due to invalid IL or missing references)
					//IL_0035: Unknown result type (might be due to invalid IL or missing references)
					CustomGrabBeamColour.LocalRotatingColour.r = f;
					if (!CustomGrabBeamColour.LocalRotatingColour.MatchSkin)
					{
						Color color = ((Graphic)_rotatingGrabColourPreviewImage).color;
						color.r = f;
						((Graphic)_rotatingGrabColourPreviewImage).color = color;
						HandleRotatingSkinMatchChange();
					}
				}, CustomGrabBeamColour.LocalRotatingColour.r, 1f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(7)));
				return ((REPOElement)val).rectTransform;
			}

			internal void <OpenPopup>b__8_25(float f)
			{
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				//IL_0035: Unknown result type (might be due to invalid IL or missing references)
				CustomGrabBeamColour.LocalRotatingColour.r = f;
				if (!CustomGrabBeamColour.LocalRotatingColour.MatchSkin)
				{
					Color color = ((Graphic)_rotatingGrabColourPreviewImage).color;
					color.r = f;
					((Graphic)_rotatingGrabColourPreviewImage).color = color;
					HandleRotatingSkinMatchChange();
				}
			}

			internal RectTransform <OpenPopup>b__8_9(Transform parent)
			{
				//IL_0045: Unknown result type (might be due to invalid IL or missing references)
				REPOSlider val = CreateColourSlider("Green", "", delegate(float f)
				{
					//IL_0022: Unknown result type (might be due to invalid IL or missing references)
					//IL_0027: Unknown result type (might be due to invalid IL or missing references)
					//IL_0035: Unknown result type (might be due to invalid IL or missing references)
					CustomGrabBeamColour.LocalRotatingColour.g = f;
					if (!CustomGrabBeamColour.LocalRotatingColour.MatchSkin)
					{
						Color color = ((Graphic)_rotatingGrabColourPreviewImage).color;
						color.g = f;
						((Graphic)_rotatingGrabColourPreviewImage).color = color;
						HandleRotatingSkinMatchChange();
					}
				}, CustomGrabBeamColour.LocalRotatingColour.g, 1f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(8)));
				return ((REPOElement)val).rectTransform;
			}

			internal void <OpenPopup>b__8_26(float f)
			{
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				//IL_0035: Unknown result type (might be due to invalid IL or missing references)
				CustomGrabBeamColour.LocalRotatingColour.g = f;
				if (!CustomGrabBeamColour.LocalRotatingColour.MatchSkin)
				{
					Color color = ((Graphic)_rotatingGrabColourPreviewImage).color;
					color.g = f;
					((Graphic)_rotatingGrabColourPreviewImage).color = color;
					HandleRotatingSkinMatchChange();
				}
			}

			internal RectTransform <OpenPopup>b__8_10(Transform parent)
			{
				//IL_0046: Unknown result type (might be due to invalid IL or missing references)
				REPOSlider val = CreateColourSlider("Blue", "", delegate(float f)
				{
					//IL_0022: Unknown result type (might be due to invalid IL or missing references)
					//IL_0027: Unknown result type (might be due to invalid IL or missing references)
					//IL_0035: Unknown result type (might be due to invalid IL or missing references)
					CustomGrabBeamColour.LocalRotatingColour.b = f;
					if (!CustomGrabBeamColour.LocalRotatingColour.MatchSkin)
					{
						Color color = ((Graphic)_rotatingGrabColourPreviewImage).color;
						color.b = f;
						((Graphic)_rotatingGrabColourPreviewImage).color = color;
						HandleRotatingSkinMatchChange();
					}
				}, CustomGrabBeamColour.LocalRotatingColour.b, 1f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(9)));
				return ((REPOElement)val).rectTransform;
			}

			internal void <OpenPopup>b__8_27(float f)
			{
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				//IL_0035: Unknown result type (might be due to invalid IL or missing references)
				CustomGrabBeamColour.LocalRotatingColour.b = f;
				if (!CustomGrabBeamColour.LocalRotatingColour.MatchSkin)
				{
					Color color = ((Graphic)_rotatingGrabColourPreviewImage).color;
					color.b = f;
					((Graphic)_rotatingGrabColourPreviewImage).color = color;
					HandleRotatingSkinMatchChange();
				}
			}

			internal RectTransform <OpenPopup>b__8_11(Transform parent)
			{
				//IL_0046: Unknown result type (might be due to invalid IL or missing references)
				REPOSlider val = CreateColourSlider("Opacity", "", delegate(float f)
				{
					//IL_0012: Unknown result type (might be due to invalid IL or missing references)
					//IL_0017: Unknown result type (might be due to invalid IL or missing references)
					//IL_0025: Unknown result type (might be due to invalid IL or missing references)
					CustomGrabBeamColour.LocalRotatingColour.a = f;
					Color color = ((Graphic)_rotatingGrabColourPreviewImage).color;
					color.a = f;
					((Graphic)_rotatingGrabColourPreviewImage).color = color;
					HandleRotatingSkinMatchChange();
				}, CustomGrabBeamColour.LocalRotatingColour.a, 0.5f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(10)));
				return ((REPOElement)val).rectTransform;
			}

			internal void <OpenPopup>b__8_28(float f)
			{
				//IL_0012: Unknown result type (might be due to invalid IL or missing references)
				//IL_0017: Unknown result type (might be due to invalid IL or missing references)
				//IL_0025: Unknown result type (might be due to invalid IL or missing references)
				CustomGrabBeamColour.LocalRotatingColour.a = f;
				Color color = ((Graphic)_rotatingGrabColourPreviewImage).color;
				color.a = f;
				((Graphic)_rotatingGrabColourPreviewImage).color = color;
				HandleRotatingSkinMatchChange();
			}

			internal RectTransform <OpenPopup>b__8_12(Transform parent)
			{
				//IL_0032: Unknown result type (might be due to invalid IL or missing references)
				REPOToggle val2 = MenuAPI.CreateREPOToggle("Match Skin Colour", (Action<bool>)delegate(bool val)
				{
					CustomGrabBeamColour.LocalRotatingColour.MatchSkin = val;
					HandleRotatingSkinMatchChange();
				}, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(11)), "Yes", "No", CustomGrabBeamColour.LocalRotatingColour.MatchSkin);
				return ((REPOElement)val2).rectTransform;
			}

			internal void <OpenPopup>b__8_29(bool val)
			{
				CustomGrabBeamColour.LocalRotatingColour.MatchSkin = val;
				HandleRotatingSkinMatchChange();
			}

			internal RectTransform <OpenPopup>b__8_13(Transform parent)
			{
				//IL_0012: Unknown result type (might be due to invalid IL or missing references)
				//IL_002d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0032: Unknown result type (might be due to invalid IL or missing references)
				REPOLabel val = MenuAPI.CreateREPOLabel("Healing Beam Colour", parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(6)));
				((Component)val).transform.localScale = Vector2.op_Implicit(new Vector2(0.5f, 0.5f));
				return ((REPOElement)val).rectTransform;
			}

			internal RectTransform <OpenPopup>b__8_14(Transform parent)
			{
				//IL_0045: Unknown result type (might be due to invalid IL or missing references)
				REPOSlider val = CreateColourSlider("Red", "", delegate(float f)
				{
					//IL_0022: Unknown result type (might be due to invalid IL or missing references)
					//IL_0027: Unknown result type (might be due to invalid IL or missing references)
					//IL_0035: Unknown result type (might be due to invalid IL or missing references)
					CustomGrabBeamColour.LocalHealingColour.r = f;
					if (!CustomGrabBeamColour.LocalHealingColour.MatchSkin)
					{
						Color color = ((Graphic)_healingGrabColourPreviewImage).color;
						color.r = f;
						((Graphic)_healingGrabColourPreviewImage).color = color;
						HandleHealingSkinMatchChange();
					}
				}, CustomGrabBeamColour.LocalHealingColour.r, 1f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(7)));
				return ((REPOElement)val).rectTransform;
			}

			internal void <OpenPopup>b__8_30(float f)
			{
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				//IL_0035: Unknown result type (might be due to invalid IL or missing references)
				CustomGrabBeamColour.LocalHealingColour.r = f;
				if (!CustomGrabBeamColour.LocalHealingColour.MatchSkin)
				{
					Color color = ((Graphic)_healingGrabColourPreviewImage).color;
					color.r = f;
					((Graphic)_healingGrabColourPreviewImage).color = color;
					HandleHealingSkinMatchChange();
				}
			}

			internal RectTransform <OpenPopup>b__8_15(Transform parent)
			{
				//IL_0045: Unknown result type (might be due to invalid IL or missing references)
				REPOSlider val = CreateColourSlider("Green", "", delegate(float f)
				{
					//IL_0022: Unknown result type (might be due to invalid IL or missing references)
					//IL_0027: Unknown result type (might be due to invalid IL or missing references)
					//IL_0035: Unknown result type (might be due to invalid IL or missing references)
					CustomGrabBeamColour.LocalHealingColour.g = f;
					if (!CustomGrabBeamColour.LocalHealingColour.MatchSkin)
					{
						Color color = ((Graphic)_healingGrabColourPreviewImage).color;
						color.g = f;
						((Graphic)_healingGrabColourPreviewImage).color = color;
						HandleHealingSkinMatchChange();
					}
				}, CustomGrabBeamColour.LocalHealingColour.g, 1f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(8)));
				return ((REPOElement)val).rectTransform;
			}

			internal void <OpenPopup>b__8_31(float f)
			{
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				//IL_0035: Unknown result type (might be due to invalid IL or missing references)
				CustomGrabBeamColour.LocalHealingColour.g = f;
				if (!CustomGrabBeamColour.LocalHealingColour.MatchSkin)
				{
					Color color = ((Graphic)_healingGrabColourPreviewImage).color;
					color.g = f;
					((Graphic)_healingGrabColourPreviewImage).color = color;
					HandleHealingSkinMatchChange();
				}
			}

			internal RectTransform <OpenPopup>b__8_16(Transform parent)
			{
				//IL_0046: Unknown result type (might be due to invalid IL or missing references)
				REPOSlider val = CreateColourSlider("Blue", "", delegate(float f)
				{
					//IL_0022: Unknown result type (might be due to invalid IL or missing references)
					//IL_0027: Unknown result type (might be due to invalid IL or missing references)
					//IL_0035: Unknown result type (might be due to invalid IL or missing references)
					CustomGrabBeamColour.LocalHealingColour.b = f;
					if (!CustomGrabBeamColour.LocalHealingColour.MatchSkin)
					{
						Color color = ((Graphic)_healingGrabColourPreviewImage).color;
						color.b = f;
						((Graphic)_healingGrabColourPreviewImage).color = color;
						HandleHealingSkinMatchChange();
					}
				}, CustomGrabBeamColour.LocalHealingColour.b, 1f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(9)));
				return ((REPOElement)val).rectTransform;
			}

			internal void <OpenPopup>b__8_32(float f)
			{
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				//IL_0035: Unknown result type (might be due to invalid IL or missing references)
				CustomGrabBeamColour.LocalHealingColour.b = f;
				if (!CustomGrabBeamColour.LocalHealingColour.MatchSkin)
				{
					Color color = ((Graphic)_healingGrabColourPreviewImage).color;
					color.b = f;
					((Graphic)_healingGrabColourPreviewImage).color = color;
					HandleHealingSkinMatchChange();
				}
			}

			internal RectTransform <OpenPopup>b__8_17(Transform parent)
			{
				//IL_0046: Unknown result type (might be due to invalid IL or missing references)
				REPOSlider val = CreateColourSlider("Opacity", "", delegate(float f)
				{
					//IL_0012: Unknown result type (might be due to invalid IL or missing references)
					//IL_0017: Unknown result type (might be due to invalid IL or missing references)
					//IL_0025: Unknown result type (might be due to invalid IL or missing references)
					CustomGrabBeamColour.LocalHealingColour.a = f;
					Color color = ((Graphic)_healingGrabColourPreviewImage).color;
					color.a = f;
					((Graphic)_healingGrabColourPreviewImage).color = color;
					HandleHealingSkinMatchChange();
				}, CustomGrabBeamColour.LocalHealingColour.a, 0.5f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(10)));
				return ((REPOElement)val).rectTransform;
			}

			internal void <OpenPopup>b__8_33(float f)
			{
				//IL_0012: Unknown result type (might be due to invalid IL or missing references)
				//IL_0017: Unknown result type (might be due to invalid IL or missing references)
				//IL_0025: Unknown result type (might be due to invalid IL or missing references)
				CustomGrabBeamColour.LocalHealingColour.a = f;
				Color color = ((Graphic)_healingGrabColourPreviewImage).color;
				color.a = f;
				((Graphic)_healingGrabColourPreviewImage).color = color;
				HandleHealingSkinMatchChange();
			}

			internal RectTransform <OpenPopup>b__8_18(Transform parent)
			{
				//IL_0032: Unknown result type (might be due to invalid IL or missing references)
				REPOToggle val2 = MenuAPI.CreateREPOToggle("Match Skin Colour", (Action<bool>)delegate(bool val)
				{
					CustomGrabBeamColour.LocalHealingColour.MatchSkin = val;
					HandleHealingSkinMatchChange();
				}, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(11)), "Yes", "No", CustomGrabBeamColour.LocalHealingColour.MatchSkin);
				return ((REPOElement)val2).rectTransform;
			}

			internal void <OpenPopup>b__8_34(bool val)
			{
				CustomGrabBeamColour.LocalHealingColour.MatchSkin = val;
				HandleHealingSkinMatchChange();
			}
		}

		private static Image _neutralGrabColourPreviewImage;

		private static GameObject _neutralGrabColourPreviewParent;

		private static Image _rotatingGrabColourPreviewImage;

		private static GameObject _rotatingGrabColourPreviewParent;

		private static Image _healingGrabColourPreviewImage;

		private static GameObject _healingGrabColourPreviewParent;

		private const float HorizontalPos = 70f;

		public static void Init()
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Expected O, but got Unknown
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Expected O, but got Unknown
			object obj = <>c.<>9__7_0;
			if (obj == null)
			{
				BuilderDelegate val = delegate(Transform parent)
				{
					//IL_002c: Unknown result type (might be due to invalid IL or missing references)
					MenuAPI.CreateREPOButton("Change Grab Colour", (Action)OpenPopup, parent, new Vector2(28.3f, 350f));
				};
				<>c.<>9__7_0 = val;
				obj = (object)val;
			}
			MenuAPI.AddElementToEscapeMenu((BuilderDelegate)obj);
			object obj2 = <>c.<>9__7_1;
			if (obj2 == null)
			{
				BuilderDelegate val2 = delegate(Transform parent)
				{
					//IL_002c: Unknown result type (might be due to invalid IL or missing references)
					MenuAPI.CreateREPOButton("Change Grab Colour", (Action)OpenPopup, parent, new Vector2(28.3f, 350f));
				};
				<>c.<>9__7_1 = val2;
				obj2 = (object)val2;
			}
			MenuAPI.AddElementToColorMenu((BuilderDelegate)obj2);
			if (!CustomGrabColourConfig.DebugAddButtonToMainMenu.Value)
			{
				return;
			}
			object obj3 = <>c.<>9__7_2;
			if (obj3 == null)
			{
				BuilderDelegate val3 = delegate(Transform parent)
				{
					//IL_002c: Unknown result type (might be due to invalid IL or missing references)
					MenuAPI.CreateREPOButton("Change Grab Colour", (Action)OpenPopup, parent, new Vector2(28.3f, 350f));
				};
				<>c.<>9__7_2 = val3;
				obj3 = (object)val3;
			}
			MenuAPI.AddElementToMainMenu((BuilderDelegate)obj3);
		}

		private static void OpenPopup()
		{
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Expected O, but got Unknown
			//IL_0064: 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_006f: Expected O, but got Unknown
			//IL_0099: 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
			//IL_00ce: 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_00d9: Expected O, but got Unknown
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Expected O, but got Unknown
			//IL_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_013d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0143: Expected O, but got Unknown
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Expected O, but got Unknown
			//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ad: Expected O, but got Unknown
			//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e2: Expected O, but got Unknown
			//IL_020c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0211: Unknown result type (might be due to invalid IL or missing references)
			//IL_0217: Expected O, but got Unknown
			//IL_0241: Unknown result type (might be due to invalid IL or missing references)
			//IL_0246: Unknown result type (might be due to invalid IL or missing references)
			//IL_024c: Expected O, but got Unknown
			//IL_0276: Unknown result type (might be due to invalid IL or missing references)
			//IL_027b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0281: Expected O, but got Unknown
			//IL_02ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b6: Expected O, but got Unknown
			//IL_02e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02eb: Expected O, but got Unknown
			//IL_0315: Unknown result type (might be due to invalid IL or missing references)
			//IL_031a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0320: Expected O, but got Unknown
			//IL_034a: Unknown result type (might be due to invalid IL or missing references)
			//IL_034f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0355: Expected O, but got Unknown
			//IL_037f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0384: Unknown result type (might be due to invalid IL or missing references)
			//IL_038a: Expected O, but got Unknown
			//IL_03b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_03bf: Expected O, but got Unknown
			//IL_0411: Unknown result type (might be due to invalid IL or missing references)
			//IL_041b: Expected O, but got Unknown
			//IL_0421: Unknown result type (might be due to invalid IL or missing references)
			//IL_042b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0435: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_03f4: Expected O, but got Unknown
			REPOPopupPage changeGrabColourPage = MenuAPI.CreateREPOPopupPage("Change Grab Beam Colour", (PresetSide)0, false, true, 1.5f);
			REPOPopupPage obj = changeGrabColourPage;
			object obj2 = <>c.<>9__8_0;
			if (obj2 == null)
			{
				BuilderDelegate val2 = delegate(Transform parent)
				{
					//IL_001a: Unknown result type (might be due to invalid IL or missing references)
					//IL_0035: Unknown result type (might be due to invalid IL or missing references)
					//IL_003a: Unknown result type (might be due to invalid IL or missing references)
					//IL_008f: 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_0060: Unknown result type (might be due to invalid IL or missing references)
					//IL_0106: Unknown result type (might be due to invalid IL or missing references)
					//IL_0123: Unknown result type (might be due to invalid IL or missing references)
					//IL_0128: Unknown result type (might be due to invalid IL or missing references)
					//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
					//IL_014f: Unknown result type (might be due to invalid IL or missing references)
					float verticalPos = GetVerticalPos(0);
					REPOLabel val41 = MenuAPI.CreateREPOLabel("Neutral Colour Preview", parent, new Vector2(452f, verticalPos - 60f));
					((Component)val41).transform.localScale = Vector2.op_Implicit(new Vector2(0.5f, 0.5f));
					if (!Object.op_Implicit((Object)(object)_neutralGrabColourPreviewParent))
					{
						CreateBeamPreviewColourRectangle(parent, new Vector2(515f, verticalPos), out _neutralGrabColourPreviewParent, out _neutralGrabColourPreviewImage);
					}
					float verticalPos2 = GetVerticalPos(1);
					REPOLabel val42 = MenuAPI.CreateREPOLabel("Rotating Colour Preview", parent, new Vector2(452f, verticalPos2 - 60f));
					((Component)val42).transform.localScale = Vector2.op_Implicit(new Vector2(0.5f, 0.5f));
					if (!Object.op_Implicit((Object)(object)_rotatingGrabColourPreviewParent))
					{
						CreateBeamPreviewColourRectangle(parent, new Vector2(515f, verticalPos2), out _rotatingGrabColourPreviewParent, out _rotatingGrabColourPreviewImage);
					}
					float verticalPos3 = GetVerticalPos(2);
					REPOLabel val43 = MenuAPI.CreateREPOLabel("Healing Colour Preview", parent, new Vector2(452f, verticalPos3 - 60f));
					((Component)val43).transform.localScale = Vector2.op_Implicit(new Vector2(0.5f, 0.5f));
					if (!Object.op_Implicit((Object)(object)_healingGrabColourPreviewParent))
					{
						CreateBeamPreviewColourRectangle(parent, new Vector2(515f, verticalPos3), out _healingGrabColourPreviewParent, out _healingGrabColourPreviewImage);
					}
				};
				<>c.<>9__8_0 = val2;
				obj2 = (object)val2;
			}
			obj.AddElement((BuilderDelegate)obj2);
			REPOPopupPage obj3 = changeGrabColourPage;
			object obj4 = <>c.<>9__8_1;
			if (obj4 == null)
			{
				ScrollViewBuilderDelegate val3 = delegate(Transform parent)
				{
					//IL_0012: Unknown result type (might be due to invalid IL or missing references)
					//IL_002d: Unknown result type (might be due to invalid IL or missing references)
					//IL_0032: Unknown result type (might be due to invalid IL or missing references)
					REPOLabel val40 = MenuAPI.CreateREPOLabel("Neutral Beam Colour", parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(0)));
					((Component)val40).transform.localScale = Vector2.op_Implicit(new Vector2(0.5f, 0.5f));
					return ((REPOElement)val40).rectTransform;
				};
				<>c.<>9__8_1 = val3;
				obj4 = (object)val3;
			}
			obj3.AddElementToScrollView((ScrollViewBuilderDelegate)obj4, 0f, 0f);
			REPOPopupPage obj5 = changeGrabColourPage;
			object obj6 = <>c.<>9__8_2;
			if (obj6 == null)
			{
				ScrollViewBuilderDelegate val4 = delegate(Transform parent)
				{
					//IL_0045: Unknown result type (might be due to invalid IL or missing references)
					REPOSlider val39 = CreateColourSlider("Red", "", delegate(float f)
					{
						//IL_0022: Unknown result type (might be due to invalid IL or missing references)
						//IL_0027: Unknown result type (might be due to invalid IL or missing references)
						//IL_0035: Unknown result type (might be due to invalid IL or missing references)
						CustomGrabBeamColour.LocalNeutralColour.r = f;
						if (!CustomGrabBeamColour.LocalNeutralColour.MatchSkin)
						{
							Color color12 = ((Graphic)_neutralGrabColourPreviewImage).color;
							color12.r = f;
							((Graphic)_neutralGrabColourPreviewImage).color = color12;
						}
					}, CustomGrabBeamColour.LocalNeutralColour.r, 1f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(1)));
					return ((REPOElement)val39).rectTransform;
				};
				<>c.<>9__8_2 = val4;
				obj6 = (object)val4;
			}
			obj5.AddElementToScrollView((ScrollViewBuilderDelegate)obj6, 0f, 0f);
			REPOPopupPage obj7 = changeGrabColourPage;
			object obj8 = <>c.<>9__8_3;
			if (obj8 == null)
			{
				ScrollViewBuilderDelegate val5 = delegate(Transform parent)
				{
					//IL_0045: Unknown result type (might be due to invalid IL or missing references)
					REPOSlider val38 = CreateColourSlider("Green", "", delegate(float f)
					{
						//IL_0022: Unknown result type (might be due to invalid IL or missing references)
						//IL_0027: Unknown result type (might be due to invalid IL or missing references)
						//IL_0035: Unknown result type (might be due to invalid IL or missing references)
						CustomGrabBeamColour.LocalNeutralColour.g = f;
						if (!CustomGrabBeamColour.LocalNeutralColour.MatchSkin)
						{
							Color color11 = ((Graphic)_neutralGrabColourPreviewImage).color;
							color11.g = f;
							((Graphic)_neutralGrabColourPreviewImage).color = color11;
						}
					}, CustomGrabBeamColour.LocalNeutralColour.g, 1f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(2)));
					return ((REPOElement)val38).rectTransform;
				};
				<>c.<>9__8_3 = val5;
				obj8 = (object)val5;
			}
			obj7.AddElementToScrollView((ScrollViewBuilderDelegate)obj8, 0f, 0f);
			REPOPopupPage obj9 = changeGrabColourPage;
			object obj10 = <>c.<>9__8_4;
			if (obj10 == null)
			{
				ScrollViewBuilderDelegate val6 = delegate(Transform parent)
				{
					//IL_0045: Unknown result type (might be due to invalid IL or missing references)
					REPOSlider val37 = CreateColourSlider("Blue", "", delegate(float f)
					{
						//IL_0022: Unknown result type (might be due to invalid IL or missing references)
						//IL_0027: Unknown result type (might be due to invalid IL or missing references)
						//IL_0035: Unknown result type (might be due to invalid IL or missing references)
						CustomGrabBeamColour.LocalNeutralColour.b = f;
						if (!CustomGrabBeamColour.LocalNeutralColour.MatchSkin)
						{
							Color color10 = ((Graphic)_neutralGrabColourPreviewImage).color;
							color10.b = f;
							((Graphic)_neutralGrabColourPreviewImage).color = color10;
						}
					}, CustomGrabBeamColour.LocalNeutralColour.b, 1f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(3)));
					return ((REPOElement)val37).rectTransform;
				};
				<>c.<>9__8_4 = val6;
				obj10 = (object)val6;
			}
			obj9.AddElementToScrollView((ScrollViewBuilderDelegate)obj10, 0f, 0f);
			REPOPopupPage obj11 = changeGrabColourPage;
			object obj12 = <>c.<>9__8_5;
			if (obj12 == null)
			{
				ScrollViewBuilderDelegate val7 = delegate(Transform parent)
				{
					//IL_0045: Unknown result type (might be due to invalid IL or missing references)
					REPOSlider val36 = CreateColourSlider("Opacity", "", delegate(float f)
					{
						//IL_0012: Unknown result type (might be due to invalid IL or missing references)
						//IL_0017: Unknown result type (might be due to invalid IL or missing references)
						//IL_0025: Unknown result type (might be due to invalid IL or missing references)
						CustomGrabBeamColour.LocalNeutralColour.a = f;
						Color color9 = ((Graphic)_neutralGrabColourPreviewImage).color;
						color9.a = f;
						((Graphic)_neutralGrabColourPreviewImage).color = color9;
					}, CustomGrabBeamColour.LocalNeutralColour.a, 0.5f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(4)));
					return ((REPOElement)val36).rectTransform;
				};
				<>c.<>9__8_5 = val7;
				obj12 = (object)val7;
			}
			obj11.AddElementToScrollView((ScrollViewBuilderDelegate)obj12, 0f, 0f);
			REPOPopupPage obj13 = changeGrabColourPage;
			object obj14 = <>c.<>9__8_6;
			if (obj14 == null)
			{
				ScrollViewBuilderDelegate val8 = delegate(Transform parent)
				{
					//IL_0031: Unknown result type (might be due to invalid IL or missing references)
					REPOToggle val35 = MenuAPI.CreateREPOToggle("Match Skin Colour", (Action<bool>)delegate(bool val)
					{
						CustomGrabBeamColour.LocalNeutralColour.MatchSkin = val;
						HandleNeutralSkinMatchChange();
					}, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(5)), "Yes", "No", CustomGrabBeamColour.LocalNeutralColour.MatchSkin);
					return ((REPOElement)val35).rectTransform;
				};
				<>c.<>9__8_6 = val8;
				obj14 = (object)val8;
			}
			obj13.AddElementToScrollView((ScrollViewBuilderDelegate)obj14, 0f, 0f);
			REPOPopupPage obj15 = changeGrabColourPage;
			object obj16 = <>c.<>9__8_7;
			if (obj16 == null)
			{
				ScrollViewBuilderDelegate val9 = delegate(Transform parent)
				{
					//IL_0012: Unknown result type (might be due to invalid IL or missing references)
					//IL_002d: Unknown result type (might be due to invalid IL or missing references)
					//IL_0032: Unknown result type (might be due to invalid IL or missing references)
					REPOLabel val34 = MenuAPI.CreateREPOLabel("Rotating Beam Colour", parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(6)));
					((Component)val34).transform.localScale = Vector2.op_Implicit(new Vector2(0.5f, 0.5f));
					return ((REPOElement)val34).rectTransform;
				};
				<>c.<>9__8_7 = val9;
				obj16 = (object)val9;
			}
			obj15.AddElementToScrollView((ScrollViewBuilderDelegate)obj16, 0f, 0f);
			REPOPopupPage obj17 = changeGrabColourPage;
			object obj18 = <>c.<>9__8_8;
			if (obj18 == null)
			{
				ScrollViewBuilderDelegate val10 = delegate(Transform parent)
				{
					//IL_0045: Unknown result type (might be due to invalid IL or missing references)
					REPOSlider val33 = CreateColourSlider("Red", "", delegate(float f)
					{
						//IL_0022: Unknown result type (might be due to invalid IL or missing references)
						//IL_0027: Unknown result type (might be due to invalid IL or missing references)
						//IL_0035: Unknown result type (might be due to invalid IL or missing references)
						CustomGrabBeamColour.LocalRotatingColour.r = f;
						if (!CustomGrabBeamColour.LocalRotatingColour.MatchSkin)
						{
							Color color8 = ((Graphic)_rotatingGrabColourPreviewImage).color;
							color8.r = f;
							((Graphic)_rotatingGrabColourPreviewImage).color = color8;
							HandleRotatingSkinMatchChange();
						}
					}, CustomGrabBeamColour.LocalRotatingColour.r, 1f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(7)));
					return ((REPOElement)val33).rectTransform;
				};
				<>c.<>9__8_8 = val10;
				obj18 = (object)val10;
			}
			obj17.AddElementToScrollView((ScrollViewBuilderDelegate)obj18, 0f, 0f);
			REPOPopupPage obj19 = changeGrabColourPage;
			object obj20 = <>c.<>9__8_9;
			if (obj20 == null)
			{
				ScrollViewBuilderDelegate val11 = delegate(Transform parent)
				{
					//IL_0045: Unknown result type (might be due to invalid IL or missing references)
					REPOSlider val32 = CreateColourSlider("Green", "", delegate(float f)
					{
						//IL_0022: Unknown result type (might be due to invalid IL or missing references)
						//IL_0027: Unknown result type (might be due to invalid IL or missing references)
						//IL_0035: Unknown result type (might be due to invalid IL or missing references)
						CustomGrabBeamColour.LocalRotatingColour.g = f;
						if (!CustomGrabBeamColour.LocalRotatingColour.MatchSkin)
						{
							Color color7 = ((Graphic)_rotatingGrabColourPreviewImage).color;
							color7.g = f;
							((Graphic)_rotatingGrabColourPreviewImage).color = color7;
							HandleRotatingSkinMatchChange();
						}
					}, CustomGrabBeamColour.LocalRotatingColour.g, 1f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(8)));
					return ((REPOElement)val32).rectTransform;
				};
				<>c.<>9__8_9 = val11;
				obj20 = (object)val11;
			}
			obj19.AddElementToScrollView((ScrollViewBuilderDelegate)obj20, 0f, 0f);
			REPOPopupPage obj21 = changeGrabColourPage;
			object obj22 = <>c.<>9__8_10;
			if (obj22 == null)
			{
				ScrollViewBuilderDelegate val12 = delegate(Transform parent)
				{
					//IL_0046: Unknown result type (might be due to invalid IL or missing references)
					REPOSlider val31 = CreateColourSlider("Blue", "", delegate(float f)
					{
						//IL_0022: Unknown result type (might be due to invalid IL or missing references)
						//IL_0027: Unknown result type (might be due to invalid IL or missing references)
						//IL_0035: Unknown result type (might be due to invalid IL or missing references)
						CustomGrabBeamColour.LocalRotatingColour.b = f;
						if (!CustomGrabBeamColour.LocalRotatingColour.MatchSkin)
						{
							Color color6 = ((Graphic)_rotatingGrabColourPreviewImage).color;
							color6.b = f;
							((Graphic)_rotatingGrabColourPreviewImage).color = color6;
							HandleRotatingSkinMatchChange();
						}
					}, CustomGrabBeamColour.LocalRotatingColour.b, 1f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(9)));
					return ((REPOElement)val31).rectTransform;
				};
				<>c.<>9__8_10 = val12;
				obj22 = (object)val12;
			}
			obj21.AddElementToScrollView((ScrollViewBuilderDelegate)obj22, 0f, 0f);
			REPOPopupPage obj23 = changeGrabColourPage;
			object obj24 = <>c.<>9__8_11;
			if (obj24 == null)
			{
				ScrollViewBuilderDelegate val13 = delegate(Transform parent)
				{
					//IL_0046: Unknown result type (might be due to invalid IL or missing references)
					REPOSlider val30 = CreateColourSlider("Opacity", "", delegate(float f)
					{
						//IL_0012: Unknown result type (might be due to invalid IL or missing references)
						//IL_0017: Unknown result type (might be due to invalid IL or missing references)
						//IL_0025: Unknown result type (might be due to invalid IL or missing references)
						CustomGrabBeamColour.LocalRotatingColour.a = f;
						Color color5 = ((Graphic)_rotatingGrabColourPreviewImage).color;
						color5.a = f;
						((Graphic)_rotatingGrabColourPreviewImage).color = color5;
						HandleRotatingSkinMatchChange();
					}, CustomGrabBeamColour.LocalRotatingColour.a, 0.5f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(10)));
					return ((REPOElement)val30).rectTransform;
				};
				<>c.<>9__8_11 = val13;
				obj24 = (object)val13;
			}
			obj23.AddElementToScrollView((ScrollViewBuilderDelegate)obj24, 0f, 0f);
			REPOPopupPage obj25 = changeGrabColourPage;
			object obj26 = <>c.<>9__8_12;
			if (obj26 == null)
			{
				ScrollViewBuilderDelegate val14 = delegate(Transform parent)
				{
					//IL_0032: Unknown result type (might be due to invalid IL or missing references)
					REPOToggle val29 = MenuAPI.CreateREPOToggle("Match Skin Colour", (Action<bool>)delegate(bool val)
					{
						CustomGrabBeamColour.LocalRotatingColour.MatchSkin = val;
						HandleRotatingSkinMatchChange();
					}, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(11)), "Yes", "No", CustomGrabBeamColour.LocalRotatingColour.MatchSkin);
					return ((REPOElement)val29).rectTransform;
				};
				<>c.<>9__8_12 = val14;
				obj26 = (object)val14;
			}
			obj25.AddElementToScrollView((ScrollViewBuilderDelegate)obj26, 0f, 0f);
			REPOPopupPage obj27 = changeGrabColourPage;
			object obj28 = <>c.<>9__8_13;
			if (obj28 == null)
			{
				ScrollViewBuilderDelegate val15 = delegate(Transform parent)
				{
					//IL_0012: Unknown result type (might be due to invalid IL or missing references)
					//IL_002d: Unknown result type (might be due to invalid IL or missing references)
					//IL_0032: Unknown result type (might be due to invalid IL or missing references)
					REPOLabel val28 = MenuAPI.CreateREPOLabel("Healing Beam Colour", parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(6)));
					((Component)val28).transform.localScale = Vector2.op_Implicit(new Vector2(0.5f, 0.5f));
					return ((REPOElement)val28).rectTransform;
				};
				<>c.<>9__8_13 = val15;
				obj28 = (object)val15;
			}
			obj27.AddElementToScrollView((ScrollViewBuilderDelegate)obj28, 0f, 0f);
			REPOPopupPage obj29 = changeGrabColourPage;
			object obj30 = <>c.<>9__8_14;
			if (obj30 == null)
			{
				ScrollViewBuilderDelegate val16 = delegate(Transform parent)
				{
					//IL_0045: Unknown result type (might be due to invalid IL or missing references)
					REPOSlider val27 = CreateColourSlider("Red", "", delegate(float f)
					{
						//IL_0022: Unknown result type (might be due to invalid IL or missing references)
						//IL_0027: Unknown result type (might be due to invalid IL or missing references)
						//IL_0035: Unknown result type (might be due to invalid IL or missing references)
						CustomGrabBeamColour.LocalHealingColour.r = f;
						if (!CustomGrabBeamColour.LocalHealingColour.MatchSkin)
						{
							Color color4 = ((Graphic)_healingGrabColourPreviewImage).color;
							color4.r = f;
							((Graphic)_healingGrabColourPreviewImage).color = color4;
							HandleHealingSkinMatchChange();
						}
					}, CustomGrabBeamColour.LocalHealingColour.r, 1f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(7)));
					return ((REPOElement)val27).rectTransform;
				};
				<>c.<>9__8_14 = val16;
				obj30 = (object)val16;
			}
			obj29.AddElementToScrollView((ScrollViewBuilderDelegate)obj30, 0f, 0f);
			REPOPopupPage obj31 = changeGrabColourPage;
			object obj32 = <>c.<>9__8_15;
			if (obj32 == null)
			{
				ScrollViewBuilderDelegate val17 = delegate(Transform parent)
				{
					//IL_0045: Unknown result type (might be due to invalid IL or missing references)
					REPOSlider val26 = CreateColourSlider("Green", "", delegate(float f)
					{
						//IL_0022: Unknown result type (might be due to invalid IL or missing references)
						//IL_0027: Unknown result type (might be due to invalid IL or missing references)
						//IL_0035: Unknown result type (might be due to invalid IL or missing references)
						CustomGrabBeamColour.LocalHealingColour.g = f;
						if (!CustomGrabBeamColour.LocalHealingColour.MatchSkin)
						{
							Color color3 = ((Graphic)_healingGrabColourPreviewImage).color;
							color3.g = f;
							((Graphic)_healingGrabColourPreviewImage).color = color3;
							HandleHealingSkinMatchChange();
						}
					}, CustomGrabBeamColour.LocalHealingColour.g, 1f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(8)));
					return ((REPOElement)val26).rectTransform;
				};
				<>c.<>9__8_15 = val17;
				obj32 = (object)val17;
			}
			obj31.AddElementToScrollView((ScrollViewBuilderDelegate)obj32, 0f, 0f);
			REPOPopupPage obj33 = changeGrabColourPage;
			object obj34 = <>c.<>9__8_16;
			if (obj34 == null)
			{
				ScrollViewBuilderDelegate val18 = delegate(Transform parent)
				{
					//IL_0046: Unknown result type (might be due to invalid IL or missing references)
					REPOSlider val25 = CreateColourSlider("Blue", "", delegate(float f)
					{
						//IL_0022: Unknown result type (might be due to invalid IL or missing references)
						//IL_0027: Unknown result type (might be due to invalid IL or missing references)
						//IL_0035: Unknown result type (might be due to invalid IL or missing references)
						CustomGrabBeamColour.LocalHealingColour.b = f;
						if (!CustomGrabBeamColour.LocalHealingColour.MatchSkin)
						{
							Color color2 = ((Graphic)_healingGrabColourPreviewImage).color;
							color2.b = f;
							((Graphic)_healingGrabColourPreviewImage).color = color2;
							HandleHealingSkinMatchChange();
						}
					}, CustomGrabBeamColour.LocalHealingColour.b, 1f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(9)));
					return ((REPOElement)val25).rectTransform;
				};
				<>c.<>9__8_16 = val18;
				obj34 = (object)val18;
			}
			obj33.AddElementToScrollView((ScrollViewBuilderDelegate)obj34, 0f, 0f);
			REPOPopupPage obj35 = changeGrabColourPage;
			object obj36 = <>c.<>9__8_17;
			if (obj36 == null)
			{
				ScrollViewBuilderDelegate val19 = delegate(Transform parent)
				{
					//IL_0046: Unknown result type (might be due to invalid IL or missing references)
					REPOSlider val24 = CreateColourSlider("Opacity", "", delegate(float f)
					{
						//IL_0012: Unknown result type (might be due to invalid IL or missing references)
						//IL_0017: Unknown result type (might be due to invalid IL or missing references)
						//IL_0025: Unknown result type (might be due to invalid IL or missing references)
						CustomGrabBeamColour.LocalHealingColour.a = f;
						Color color = ((Graphic)_healingGrabColourPreviewImage).color;
						color.a = f;
						((Graphic)_healingGrabColourPreviewImage).color = color;
						HandleHealingSkinMatchChange();
					}, CustomGrabBeamColour.LocalHealingColour.a, 0.5f, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(10)));
					return ((REPOElement)val24).rectTransform;
				};
				<>c.<>9__8_17 = val19;
				obj36 = (object)val19;
			}
			obj35.AddElementToScrollView((ScrollViewBuilderDelegate)obj36, 0f, 0f);
			REPOPopupPage obj37 = changeGrabColourPage;
			object obj38 = <>c.<>9__8_18;
			if (obj38 == null)
			{
				ScrollViewBuilderDelegate val20 = delegate(Transform parent)
				{
					//IL_0032: Unknown result type (might be due to invalid IL or missing references)
					REPOToggle val23 = MenuAPI.CreateREPOToggle("Match Skin Colour", (Action<bool>)delegate(bool val)
					{
						CustomGrabBeamColour.LocalHealingColour.MatchSkin = val;
						HandleHealingSkinMatchChange();
					}, parent, new Vector2(0f, GetVerticalOffsetForScrollChildren(11)), "Yes", "No", CustomGrabBeamColour.LocalHealingColour.MatchSkin);
					return ((REPOElement)val23).rectTransform;
				};
				<>c.<>9__8_18 = val20;
				obj38 = (object)val20;
			}
			obj37.AddElementToScrollView((ScrollViewBuilderDelegate)obj38, 0f, 0f);
			changeGrabColourPage.AddElement((BuilderDelegate)delegate(Transform parent)
			{
				//IL_0030: Unknown result type (might be due to invalid IL or missing references)
				//IL_006a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0077: Unknown result type (might be due to invalid IL or missing references)
				//IL_0081: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
				REPOButton val21 = MenuAPI.CreateREPOButton("Done", (Action)delegate
				{
					changeGrabColourPage.ClosePage(true);
					CustomGrabBeamColour.UpdateBeamColourForAllBeams();
					CustomGrabBeamColour.SaveLocalColoursToConfig();
				}, parent, new Vector2(70f, 30f));
				REPOButton val22 = MenuAPI.CreateREPOButton("Reset", (Action)delegate
				{
					changeGrabColourPage.ClosePage(true);
					CustomGrabBeamColour.ResetBeamColours();
					CustomGrabBeamColour.UpdateBeamColourForAllBeams();
					CustomGrabBeamColour.SaveLocalColoursToConfig();
				}, parent, new Vector2(590f, 30f));
				val22.overrideButtonSize = val22.GetLabelSize() / 2f;
				((Component)val22).transform.localScale = Vector2.op_Implicit(new Vector2(0.5f, 0.5f));
			});
			SetupPreviewRectangleColours(CustomGrabBeamColour.LocalNeutralColour.Colour, CustomGrabBeamColour.LocalHealingColour.Colour, CustomGrabBeamColour.LocalRotatingColour.Colour);
			changeGrabColourPage.OpenPage(false);
		}

		private static void SetupPreviewRectangleColours(Color neutralColour, Color healingColour, Color rotatingColour)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			((Graphic)_neutralGrabColourPreviewImage).color = neutralColour;
			((Graphic)_healingGrabColourPreviewImage).color = healingColour;
			((Graphic)_rotatingGrabColourPreviewImage).color = rotatingColour;
			HandleNeutralSkinMatchChange();
			HandleRotatingSkinMatchChange();
			HandleHealingSkinMatchChange();
		}

		private static void HandleNeutralSkinMatchChange()
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			((Graphic)_neutralGrabColourPreviewImage).color = (CustomGrabBeamColour.LocalNeutralColour.MatchSkin ? CustomGrabBeamColour.GetLocalBodyColour(Color.black) : CustomGrabBeamColour.LocalNeutralColour.Colour);
			Color color = ((Graphic)_neutralGrabColourPreviewImage).color;
			color.a = CustomGrabBeamColour.LocalNeutralColour.Colour.a;
			((Graphic)_neutralGrabColourPreviewImage).color = color;
		}

		private static void HandleRotatingSkinMatchChange()
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			((Graphic)_rotatingGrabColourPreviewImage).color = (CustomGrabBeamColour.LocalRotatingColour.MatchSkin ? CustomGrabBeamColour.GetLocalBodyColour(Color.black) : CustomGrabBeamColour.LocalRotatingColour.Colour);
			Color color = ((Graphic)_rotatingGrabColourPreviewImage).color;
			color.a = CustomGrabBeamColour.LocalRotatingColour.Colour.a;
			((Graphic)_rotatingGrabColourPreviewImage).color = color;
		}

		private static void HandleHealingSkinMatchChange()
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			((Graphic)_healingGrabColourPreviewImage).color = (CustomGrabBeamColour.LocalHealingColour.MatchSkin ? CustomGrabBeamColour.GetLocalBodyColour(Color.black) : CustomGrabBeamColour.LocalHealingColour.Colour);
			Color color = ((Graphic)_healingGrabColourPreviewImage).color;
			color.a = CustomGrabBeamColour.LocalHealingColour.Colour.a;
			((Graphic)_healingGrabColourPreviewImage).color = color;
		}

		private static void CreateBeamPreviewColourRectangle(Transform parent, Vector2 position, out GameObject colourPreviewParent, out Image colourPreviewImage)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Expected O, but got Unknown
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: 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)
			colourPreviewParent = new GameObject();
			((Object)colourPreviewParent).name = "Grab Beam Colour Preview Rectangle Parent";
			colourPreviewParent.transform.SetParent(parent);
			Canvas val = colourPreviewParent.AddComponent<Canvas>();
			((Component)val).transform.SetParent(colourPreviewParent.gameObject.transform.parent);
			GameObject val2 = new GameObject();
			val2.transform.SetParent(((Component)val).gameObject.transform.parent);
			colourPreviewImage = val2.AddComponent<Image>();
			((Object)colourPreviewImage).name = "Grab Beam Colour Preview Rectangle Image";
			((Component)colourPreviewImage).transform.SetParent(val2.gameObject.transform.parent);
			((Graphic)colourPreviewImage).color = new Color(1f, 0f, 0f);
			((Component)colourPreviewImage).gameObject.transform.position = Vector2.op_Implicit(position);
			((Component)colourPreviewImage).gameObject.transform.localScale = new Vector3(0.85f, 0.85f, 1f);
		}

		private static REPOSlider CreateColourSlider(string name, string desc, Action<float> onChange, float initial, float max, Transform parent, Vector2 localPosition)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			return MenuAPI.CreateREPOSlider(name, desc, onChange, parent, localPosition, 0f, max, 2, initial, "", "", (BarBehavior)0);
		}

		private static float GetVerticalOffsetForScrollChildren(int index)
		{
			return 40 * index;
		}

		private static float GetVerticalPos(int offset)
		{
			int num = -Math.Abs(-offset);
			num += 3;
			return -12f + (float)(110 * num);
		}
	}
	public static class ConfigUtil
	{
		public static string ColorToString(Color color)
		{
			return color.r + ", " + color.g + ", " + color.b + ", " + color.a;
		}

		public static Color StringToColor(string color, Color defaultColour)
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			string[] array = color.Split(',');
			switch (array.Length)
			{
			case 3:
			{
				float[] array3 = new float[3];
				for (int j = 0; j < array.Length; j++)
				{
					try
					{
						array3.SetValue(float.Parse(array[j].Trim()), j);
					}
					catch
					{
						return defaultColour;
					}
				}
				return new Color(array3[0], array3[1], array3[2], 0.2f);
			}
			case 4:
			{
				float[] array2 = new float[4];
				for (int i = 0; i < array.Length; i++)
				{
					try
					{
						array2.SetValue(float.Parse(array[i].Trim()), i);
					}
					catch
					{
						return defaultColour;
					}
				}
				return new Color(array2[0], array2[1], array2[2], array2[3]);
			}
			default:
				return defaultColour;
			}
		}
	}
	public static class CustomGrabColourConfig
	{
		public struct BeamConfigEntries
		{
			public readonly ConfigEntry<string> BeamColour;

			public readonly ConfigEntry<bool> MatchSkin;

			public BeamConfigEntries(ConfigEntry<string> beamColour, ConfigEntry<bool> matchSkin)
			{
				BeamColour = beamColour;
				MatchSkin = matchSkin;
			}
		}

		private static readonly Dictionary<GrabBeamColourSettings.BeamType, BeamConfigEntries> BeamTypeToConfigEntries = new Dictionary<GrabBeamColourSettings.BeamType, BeamConfigEntries>();

		public const float DefaultOpacity = 0.2f;

		public const float MaxOpacity = 0.5f;

		public static readonly Color NeutralDefaultColour = new Color(1f, 0.58f, 0.19f, 0.35f);

		public static readonly Color HealingDefaultColour = new Color(0.17f, 1f, 0.17f, 0.2f);

		public static readonly Color RotatingDefaultColour = new Color(0.65f, 0.06f, 0.8f, 0.2f);

		public static BeamConfigEntries NeutralGrabBeam;

		public static BeamConfigEntries HealingGrabBeam;

		public static BeamConfigEntries RotatingGrabBeam;

		public static ConfigEntry<bool> EnableDebugLogs;

		public static ConfigEntry<bool> DebugAddButtonToMainMenu;

		private const string ColourNotes = "\nStored as R,G,B,A values in 0-1 range";

		public static void Init(ConfigFile config)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			ConfigEntry<string> beamColour = config.Bind<string>("General", "NeutralGrabBeamColour", ConfigUtil.ColorToString(NeutralDefaultColour), "The default colour of the grab beam when holding an item.\nStored as R,G,B,A values in 0-1 range");
			ConfigEntry<bool> matchSkin = config.Bind<bool>("General", "NeutralGrabBeamMatchSkin", true, "Should the neutral grab beam match the colour of your skin?");
			NeutralGrabBeam = new BeamConfigEntries(beamColour, matchSkin);
			BeamTypeToConfigEntries.Add(GrabBeamColourSettings.BeamType.Neutral, NeutralGrabBeam);
			ConfigEntry<string> beamColour2 = config.Bind<string>("General", "RotatingGrabBeamColour", ConfigUtil.ColorToString(RotatingDefaultColour), "The colour of the grab beam when rotating an item or monster.\nStored as R,G,B,A values in 0-1 range");
			ConfigEntry<bool> matchSkin2 = config.Bind<bool>("General", "RotatingGrabBeamMatchSkin", false, "Should the rotating grab beam match the colour of your skin?");
			RotatingGrabBeam = new BeamConfigEntries(beamColour2, matchSkin2);
			BeamTypeToConfigEntries.Add(GrabBeamColourSettings.BeamType.Rotate, RotatingGrabBeam);
			ConfigEntry<string> beamColour3 = config.Bind<string>("General", "HealingGrabBeamColour", ConfigUtil.ColorToString(HealingDefaultColour), "The colour of the grab beam when healing another player.\nStored as R,G,B,A values in 0-1 range");
			ConfigEntry<bool> matchSkin3 = config.Bind<bool>("General", "HealingGrabBeamMatchSkin", false, "Should the healing grab beam match the colour of your skin?");
			HealingGrabBeam = new BeamConfigEntries(beamColour3, matchSkin3);
			BeamTypeToConfigEntries.Add(GrabBeamColourSettings.BeamType.Heal, HealingGrabBeam);
			EnableDebugLogs = config.Bind<bool>("Debug", "EnableDebugLogs", false, "Outputs additional debugging information to the log");
			DebugAddButtonToMainMenu = config.Bind<bool>("Debug", "AddConfigToMainMenu", false, "Adds the config menu button to the main menu");
			LoadValuesFromConfig();
		}

		private static void LoadValuesFromConfig()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: 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_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			Color val = ConfigUtil.StringToColor(NeutralGrabBeam.BeamColour.Value, NeutralDefaultColour);
			val.a = Mathf.Clamp(val.a, 0f, 0.5f);
			CustomGrabBeamColour.LocalNeutralColour = new GrabBeamColourSettings(val, NeutralGrabBeam.MatchSkin.Value, GrabBeamColourSettings.BeamType.Neutral);
			Color val2 = ConfigUtil.StringToColor(RotatingGrabBeam.BeamColour.Value, RotatingDefaultColour);
			val2.a = Mathf.Clamp(val2.a, 0f, 0.5f);
			CustomGrabBeamColour.LocalRotatingColour = new GrabBeamColourSettings(val2, RotatingGrabBeam.MatchSkin.Value, GrabBeamColourSettings.BeamType.Rotate);
			Color val3 = ConfigUtil.StringToColor(HealingGrabBeam.BeamColour.Value, HealingDefaultColour);
			val3.a = Mathf.Clamp(val3.a, 0f, 0.5f);
			CustomGrabBeamColour.LocalHealingColour = new GrabBeamColourSettings(val3, HealingGrabBeam.MatchSkin.Value, GrabBeamColourSettings.BeamType.Heal);
		}

		public static void SaveColour(GrabBeamColourSettings beamColourSettings)
		{
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			Plugin.LogMessageIfDebug("Saving colour to config file: " + beamColourSettings);
			beamColourSettings.a = Mathf.Clamp(beamColourSettings.a, 0f, 0.5f);
			if (!BeamTypeToConfigEntries.TryGetValue(beamColourSettings.CurrentBeamType, out var value))
			{
				Plugin.LogWarning("Unable to save colour value for beam type: " + beamColourSettings.CurrentBeamType);
			}
			value.BeamColour.Value = ConfigUtil.ColorToString(beamColourSettings.Colour);
			value.MatchSkin.Value = beamColourSettings.MatchSkin;
		}
	}
}

plugins/dev.bw.nametag_colour.dll

Decompiled 2 months ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("dev.bw.nametag_colour")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.9.0")]
[assembly: AssemblyInformationalVersion("1.0.9+82260e9d0a36ac47a26cbda02f447736e2934fef")]
[assembly: AssemblyProduct("NametagColour")]
[assembly: AssemblyTitle("dev.bw.nametag_colour")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.9.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace NametagColour
{
	[BepInPlugin("dev.bw.nametag_colour", "NametagColour", "1.0.9")]
	[BepInProcess("REPO.exe")]
	public class Plugin : BaseUnityPlugin
	{
		internal static ManualLogSource Logger;

		private static Harmony _hi;

		private void Awake()
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			Logger = ((BaseUnityPlugin)this).Logger;
			Logger.LogInfo((object)"Plugin dev.bw.nametag_colour is loaded!");
			_hi = new Harmony("dev.bw.nametag_colour");
			_hi.PatchAll();
		}

		private void OnDestroy()
		{
			_hi.UnpatchSelf();
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "dev.bw.nametag_colour";

		public const string PLUGIN_NAME = "NametagColour";

		public const string PLUGIN_VERSION = "1.0.9";
	}
}
namespace NametagColour.Patches
{
	[HarmonyPatch(typeof(MenuPlayerListed), "Update")]
	public class MenuPlayerPatch
	{
		private static void Postfix(MenuPlayerListed __instance)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			PlayerAvatar playerAvatar = __instance.playerAvatar;
			((Graphic)__instance.playerName).color = playerAvatar.playerAvatarVisuals.color;
			((TMP_Text)__instance.playerName).alpha = (playerAvatar.voiceChat.isTalking ? 1f : 0.5f);
		}
	}
	[HarmonyPatch(typeof(SpectateNameUI), "SetName")]
	public class SpectatePatch
	{
		private static void Postfix(SpectateNameUI __instance, string name)
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			PlayerAvatar val = GameDirector.instance.PlayerList.Find((PlayerAvatar x) => x.playerName == name);
			((Graphic)__instance.Text).color = val.playerAvatarVisuals.color;
			((TMP_Text)__instance.Text).alpha = (val.voiceChat.isTalking ? 1f : 0.5f);
		}
	}
	[HarmonyPatch(typeof(WorldSpaceUIPlayerName), "Update")]
	public class WorldUIPatch
	{
		private static void Postfix(WorldSpaceUIPlayerName __instance)
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			TextMeshProUGUI text = __instance.text;
			PlayerAvatar playerAvatar = __instance.playerAvatar;
			if (!((Object)(object)text == (Object)null) && !((Object)(object)playerAvatar?.playerAvatarVisuals == (Object)null))
			{
				Color color = ((Graphic)text).color;
				Color color2 = playerAvatar.playerAvatarVisuals.color;
				((Graphic)text).color = new Color(color2.r, color2.g, color2.b, color.a);
			}
		}
	}
}

plugins/Eggs.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
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("")]
[assembly: AssemblyCompany("Omniscye")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("Eggs")]
[assembly: AssemblyTitle("Eggs")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.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 Omni.WalkieTalkie
{
	[BepInPlugin("omni.repo.walkietalkie", "Omni Walkie-Talkie", "1.2.0")]
	public class WalkieTalkiePlugin : BaseUnityPlugin
	{
		[HarmonyPatch]
		internal static class Patch_AttachController
		{
			[HarmonyPatch(typeof(PlayerVoiceChat), "Awake")]
			[HarmonyPostfix]
			private static void Postfix(PlayerVoiceChat __instance)
			{
				WalkieController walkieController = default(WalkieController);
				if (!((Component)__instance).gameObject.TryGetComponent<WalkieController>(ref walkieController))
				{
					((Component)__instance).gameObject.AddComponent<WalkieController>();
				}
			}
		}

		[HarmonyPatch(typeof(PlayerAvatarRightArm), "Update")]
		internal static class Patch_RightArmPose
		{
			private static bool Prefix(PlayerAvatarRightArm __instance)
			{
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				try
				{
					if (WalkieController.PlayersTalking.Contains(__instance.playerAvatar.photonView.ViewID))
					{
						__instance.SetPose(WalkieController.WalkiePose);
						__instance.HeadAnimate(false);
						__instance.AnimatePose();
						return false;
					}
				}
				catch
				{
				}
				return true;
			}
		}

		public class WalkieController : MonoBehaviourPun
		{
			[CompilerGenerated]
			private sealed class <StopTalkingAfter>d__37 : IEnumerator<object>, IEnumerator, IDisposable
			{
				private int <>1__state;

				private object <>2__current;

				public float delay;

				public WalkieController <>4__this;

				object IEnumerator<object>.Current
				{
					[DebuggerHidden]
					get
					{
						return <>2__current;
					}
				}

				object IEnumerator.Current
				{
					[DebuggerHidden]
					get
					{
						return <>2__current;
					}
				}

				[DebuggerHidden]
				public <StopTalkingAfter>d__37(int <>1__state)
				{
					this.<>1__state = <>1__state;
				}

				[DebuggerHidden]
				void IDisposable.Dispose()
				{
					<>1__state = -2;
				}

				private bool MoveNext()
				{
					//IL_0033: Unknown result type (might be due to invalid IL or missing references)
					//IL_003d: Expected O, but got Unknown
					switch (<>1__state)
					{
					default:
						return false;
					case 0:
						<>1__state = -1;
						<>4__this._canToggle = false;
						<>2__current = (object)new WaitForSeconds(delay);
						<>1__state = 1;
						return true;
					case 1:
						<>1__state = -1;
						((MonoBehaviourPun)<>4__this).photonView.RPC("RPC_SetVoiceRangeAndFilters", (RpcTarget)0, new object[2] { 25, false });
						if ((Object)(object)<>4__this._talkieLocal != (Object)null)
						{
							<>4__this._talkieLocal.SetActive(false);
						}
						<>4__this._canToggle = true;
						return false;
					}
				}

				bool IEnumerator.MoveNext()
				{
					//ILSpy generated this explicit interface implementation from .override directive in MoveNext
					return this.MoveNext();
				}

				[DebuggerHidden]
				void IEnumerator.Reset()
				{
					throw new NotSupportedException();
				}
			}

			public static readonly HashSet<int> PlayersTalking = new HashSet<int>();

			public static readonly Vector3 WalkiePose = new Vector3(0f, -30f, 0f);

			private const string BundleBase = "walky";

			private const string PrefabName = "Talky";

			private const string SfxOnName = "OnSound";

			private const string SfxOffName = "OffSound";

			private const string SfxIdleName = "IdleOnSound";

			private static readonly Vector3 TalkiePos = new Vector3(-0.1f, -0.05f, 0.3f);

			private static readonly Quaternion TalkieRotation = Quaternion.Euler(350f, 179f, 45f);

			private static readonly Vector3 RemoteTalkiePos = new Vector3(-0.15f, -0.25f, 0.65f);

			private static readonly Quaternion RemoteTalkieRotation = Quaternion.Euler(15f, 215f, 345f);

			private bool _bootstrapped;

			private PlayerAvatar _localAvatar;

			private float _maxBattery;

			private float _battery;

			private bool _recharge;

			private float _rechargeRatePerSec;

			private bool _enemiesHear;

			private KeyCode _pushKey = (KeyCode)118;

			private WalkieBatteryUI _batteryUi;

			private Transform _localParent;

			private GameObject _talkieLocal;

			private GameObject _talkieRemote;

			private AudioSource _sfxOn;

			private AudioSource _sfxOff;

			private AudioSource _sfxIdle;

			private bool _usingRadio;

			private bool _canToggle = true;

			private void OnEnable()
			{
				SceneManager.sceneLoaded += OnSceneLoaded;
			}

			private void OnDisable()
			{
				SceneManager.sceneLoaded -= OnSceneLoaded;
			}

			private void OnSceneLoaded(Scene s, LoadSceneMode m)
			{
				if (IsInGame())
				{
					return;
				}
				_bootstrapped = false;
				if (IsMasterOrSingle())
				{
					MaxBattery = CFG_MaxBattery.Value;
					Recharge = CFG_Recharge.Value;
					RechargeRatePerSec = CFG_RechargeRatePerSec.Value;
					EnemiesHear = CFG_EnemiesHear.Value;
					((MonoBehaviourPun)this).photonView.RPC("RPC_SyncSettings", (RpcTarget)0, new object[4] { MaxBattery, Recharge, EnemiesHear, RechargeRatePerSec });
					ManualLogSource log = Log;
					if (log != null)
					{
						log.LogInfo((object)string.Format("[{0}] Sync settings → max={1}, recharge={2}, enemiesHear={3}, rechargeRate={4:0.##}", "Omni Walkie-Talkie", MaxBattery, Recharge, EnemiesHear, RechargeRatePerSec));
					}
				}
			}

			private void Start()
			{
				//IL_0023: Unknown result type (might be due to invalid IL or missing references)
				TryResolveKey(CFG_TalkKey.Value);
				ManualLogSource log = Log;
				if (log != null)
				{
					log.LogInfo((object)$"[Walkie] Push-to-talk = {_pushKey}");
				}
			}

			private void Update()
			{
				//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
				//IL_010a: Unknown result type (might be due to invalid IL or missing references)
				if (!((MonoBehaviourPun)this).photonView.IsMine)
				{
					return;
				}
				bool flag = IsInGame();
				if (flag && !_bootstrapped)
				{
					_bootstrapped = true;
					Bootstrap();
				}
				if (!flag || (Object)(object)_localAvatar == (Object)null || _localAvatar.spectating)
				{
					if (_usingRadio)
					{
						ForceStopTalking();
					}
					if ((Object)(object)_batteryUi != (Object)null && ((Component)_batteryUi).gameObject.activeSelf)
					{
						((Component)_batteryUi).gameObject.SetActive(false);
					}
					return;
				}
				if ((Object)(object)_batteryUi != (Object)null && !((Component)_batteryUi).gameObject.activeSelf)
				{
					((Component)_batteryUi).gameObject.SetActive(true);
				}
				if (Input.GetKey(_pushKey))
				{
					BeginTalking();
				}
				else if (Input.GetKeyUp(_pushKey))
				{
					EndTalking();
				}
				TickBattery();
				UpdateSfxVisibility();
			}

			private void Bootstrap()
			{
				_maxBattery = MaxBattery;
				_battery = Mathf.Max(0f, _maxBattery);
				_recharge = Recharge;
				_rechargeRatePerSec = RechargeRatePerSec;
				_enemiesHear = EnemiesHear;
				PlayerAvatar[] array = Object.FindObjectsOfType<PlayerAvatar>();
				foreach (PlayerAvatar val in array)
				{
					if (val.photonView.IsMine)
					{
						_localAvatar = val;
						break;
					}
				}
				if ((Object)(object)_localAvatar == (Object)null)
				{
					ManualLogSource log = Log;
					if (log != null)
					{
						log.LogWarning((object)"[Walkie] No local PlayerAvatar yet.");
					}
					return;
				}
				_localParent = FindGrabberTarget(((Component)_localAvatar).transform);
				if ((Object)(object)_localParent == (Object)null)
				{
					Transform parent = ((Component)_localAvatar).transform.parent;
					_localParent = ((parent != null) ? parent.Find("Local Camera") : null);
					if ((Object)(object)_localParent == (Object)null)
					{
						ManualLogSource log2 = Log;
						if (log2 != null)
						{
							log2.LogWarning((object)"[Walkie] Neither [RIG]/Grabber Target nor Local Camera found — skipping local talkie mesh.");
						}
					}
				}
				TryCreateBatteryUi();
				TryCreateLocalTalkie();
				((MonoBehaviourPun)this).photonView.RPC("RPC_CreateRemoteTalkieOnRightArm", (RpcTarget)4, new object[1] { _localAvatar.photonView.ViewID });
				((MonoBehaviourPun)this).photonView.RPC("RPC_SetLocalAvatarViewId", (RpcTarget)0, new object[1] { _localAvatar.photonView.ViewID });
			}

			private void BeginTalking()
			{
				if (!_usingRadio && _canToggle && !(_battery <= 1f))
				{
					_usingRadio = true;
					SetVoiceTransmit(enable: true);
					if ((Object)(object)_talkieLocal != (Object)null && !_talkieLocal.activeSelf)
					{
						_talkieLocal.SetActive(true);
					}
					((MonoBehaviourPun)this).photonView.RPC("RPC_SetVoiceRangeAndFilters", (RpcTarget)0, new object[2] { 100, true });
					((MonoBehaviourPun)this).photonView.RPC("RPC_SetTalkingFlag", (RpcTarget)0, new object[2]
					{
						_localAvatar.photonView.ViewID,
						true
					});
					((MonoBehaviourPun)this).photonView.RPC("RPC_ShowRemoteTalkie", (RpcTarget)1, new object[1] { true });
				}
			}

			private void EndTalking()
			{
				if (_usingRadio)
				{
					_usingRadio = false;
					SetVoiceTransmit(enable: false);
					((MonoBehaviourPun)this).photonView.RPC("RPC_ShowRemoteTalkie", (RpcTarget)1, new object[1] { false });
					((MonoBehaviourPun)this).photonView.RPC("RPC_SetTalkingFlag", (RpcTarget)0, new object[2]
					{
						_localAvatar.photonView.ViewID,
						false
					});
					((MonoBehaviour)this).StartCoroutine(StopTalkingAfter(0.4f));
				}
			}

			private void ForceStopTalking()
			{
				_usingRadio = false;
				SetVoiceTransmit(enable: false);
				((MonoBehaviourPun)this).photonView.RPC("RPC_ShowRemoteTalkie", (RpcTarget)1, new object[1] { false });
				((MonoBehaviourPun)this).photonView.RPC("RPC_SetVoiceRangeAndFilters", (RpcTarget)0, new object[2] { 25, false });
				((MonoBehaviourPun)this).photonView.RPC("RPC_SetTalkingFlag", (RpcTarget)0, new object[2]
				{
					_localAvatar.photonView.ViewID,
					false
				});
				if ((Object)(object)_talkieLocal != (Object)null)
				{
					_talkieLocal.SetActive(false);
				}
			}

			[IteratorStateMachine(typeof(<StopTalkingAfter>d__37))]
			private IEnumerator StopTalkingAfter(float delay)
			{
				//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
				return new <StopTalkingAfter>d__37(0)
				{
					<>4__this = this,
					delay = delay
				};
			}

			private void SetVoiceTransmit(bool enable)
			{
				try
				{
					Component val = ((Component)this).GetComponent(Type.GetType("Photon.Voice.PUN.PhotonVoiceView, PhotonVoice.PUN")) ?? ((Component)this).GetComponent(Type.GetType("Photon.Voice.Unity.PhotonVoiceView, PhotonVoice.Unity"));
					if (!((Object)(object)val == (Object)null))
					{
						object obj = ((object)val).GetType().GetProperty("RecorderInUse")?.GetValue(val, null);
						obj?.GetType().GetProperty("TransmitEnabled")?.SetValue(obj, enable, null);
					}
				}
				catch
				{
				}
			}

			private void TickBattery()
			{
				if (_usingRadio)
				{
					_battery -= Time.deltaTime * 3f;
					if (_battery <= 0f)
					{
						_battery = 0f;
						EndTalking();
					}
				}
				else if (_recharge)
				{
					_battery += Time.deltaTime * _rechargeRatePerSec;
					if (_battery > _maxBattery)
					{
						_battery = _maxBattery;
					}
				}
				if ((Object)(object)_batteryUi != (Object)null)
				{
					_batteryUi.Set(_battery, _maxBattery);
				}
			}

			private void TryCreateBatteryUi()
			{
				//IL_005a: Unknown result type (might be due to invalid IL or missing references)
				//IL_006e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0073: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
				GameObject val = GameObject.Find("Energy");
				if ((Object)(object)val == (Object)null)
				{
					ManualLogSource log = Log;
					if (log != null)
					{
						log.LogWarning((object)"[Walkie] 'Energy' UI not found; skipping battery HUD.");
					}
					return;
				}
				GameObject val2 = Object.Instantiate<GameObject>(val, val.transform.parent);
				((Object)val2).name = "WalkieEnergy";
				Transform transform = val2.transform;
				transform.localPosition += new Vector3(0f, -33f, 0f);
				EnergyUI component = val2.GetComponent<EnergyUI>();
				if (Object.op_Implicit((Object)(object)component))
				{
					Object.DestroyImmediate((Object)(object)component);
				}
				TextMeshProUGUI[] componentsInChildren = val2.GetComponentsInChildren<TextMeshProUGUI>(true);
				foreach (TextMeshProUGUI val3 in componentsInChildren)
				{
					((Graphic)val3).color = new Color(0.88f, 0.69f, 1f, 1f);
				}
				Image componentInChildren = val2.GetComponentInChildren<Image>(true);
				if (Object.op_Implicit((Object)(object)componentInChildren))
				{
					((Behaviour)componentInChildren).enabled = false;
				}
				_batteryUi = val2.AddComponent<WalkieBatteryUI>();
				_batteryUi.Set(_maxBattery, _maxBattery);
			}

			private void TryCreateLocalTalkie()
			{
				//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
				//IL_010c: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
				GameObject prefab = AssetLoader.GetPrefab("Talky", "walky");
				if ((Object)(object)prefab == (Object)null)
				{
					ManualLogSource log = Log;
					if (log != null)
					{
						log.LogError((object)"[Walkie] Prefab not found in bundle. Place bundle next to DLL. (bundle='walky', prefab='Talky')");
					}
				}
				else if (!((Object)(object)_localParent == (Object)null))
				{
					_talkieLocal = Object.Instantiate<GameObject>(prefab, _localParent);
					bool flag = string.Equals(((Object)_localParent).name, "Grabber Target", StringComparison.OrdinalIgnoreCase) || ((Object)_localParent).name.IndexOf("Grabber", StringComparison.OrdinalIgnoreCase) >= 0;
					float num = Mathf.Abs(CFG_RollDegrees.Value);
					Quaternion localRotation = Quaternion.AngleAxis(num, Vector3.forward);
					if (flag)
					{
						_talkieLocal.transform.localPosition = Vector3.zero;
						_talkieLocal.transform.localRotation = localRotation;
					}
					else
					{
						_talkieLocal.transform.localPosition = TalkiePos;
						_talkieLocal.transform.localRotation = TalkieRotation;
					}
					SetWorldScale(_talkieLocal.transform, CFG_WorldScale.Value);
					_talkieLocal.SetActive(false);
					_sfxOn = FindChildAudio(_talkieLocal, "OnSound");
					_sfxOff = FindChildAudio(_talkieLocal, "OffSound");
					_sfxIdle = FindChildAudio(_talkieLocal, "IdleOnSound");
					SetGoActive((Component)(object)_sfxOn, active: false);
					SetGoActive((Component)(object)_sfxOff, active: false);
					SetGoActive((Component)(object)_sfxIdle, active: false);
				}
			}

			[PunRPC]
			private void RPC_CreateRemoteTalkieOnRightArm(int ownerAvatarViewId)
			{
				//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
				//IL_010f: Unknown result type (might be due to invalid IL or missing references)
				//IL_017c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0192: Unknown result type (might be due to invalid IL or missing references)
				PlayerAvatar val = null;
				PlayerAvatar[] array = Object.FindObjectsOfType<PlayerAvatar>();
				foreach (PlayerAvatar val2 in array)
				{
					if ((Object)(object)val2.photonView != (Object)null && val2.photonView.ViewID == ownerAvatarViewId)
					{
						val = val2;
						break;
					}
				}
				if ((Object)(object)val == (Object)null)
				{
					ManualLogSource log = Log;
					if (log != null)
					{
						log.LogWarning((object)$"[Walkie] Remote avatar (ViewID={ownerAvatarViewId}) not found; remote prop skipped.");
					}
					return;
				}
				GameObject prefab = AssetLoader.GetPrefab("Talky", "walky");
				if ((Object)(object)prefab == (Object)null)
				{
					return;
				}
				Transform val3 = FindGrabberTarget(((Component)val).transform);
				float num = Mathf.Abs(CFG_RollDegrees.Value);
				Quaternion localRotation = Quaternion.AngleAxis(num, Vector3.forward);
				if ((Object)(object)val3 != (Object)null)
				{
					_talkieRemote = Object.Instantiate<GameObject>(prefab, val3);
					_talkieRemote.transform.localPosition = Vector3.zero;
					_talkieRemote.transform.localRotation = localRotation;
				}
				else
				{
					Transform parent = ((Component)val).transform.parent;
					PlayerAvatarRightArm val4 = ((parent != null) ? ((Component)parent).GetComponentInChildren<PlayerAvatarRightArm>() : null);
					if ((Object)(object)val4 == (Object)null)
					{
						ManualLogSource log2 = Log;
						if (log2 != null)
						{
							log2.LogWarning((object)"[Walkie] PlayerAvatarRightArm not found; remote prop skipped.");
						}
						return;
					}
					_talkieRemote = Object.Instantiate<GameObject>(prefab, val4.rightArmTransform);
					_talkieRemote.transform.localPosition = RemoteTalkiePos;
					_talkieRemote.transform.localRotation = RemoteTalkieRotation;
				}
				SetWorldScale(_talkieRemote.transform, CFG_WorldScale.Value);
				_talkieRemote.SetActive(false);
				ManualLogSource log3 = Log;
				if (log3 != null)
				{
					log3.LogInfo((object)"[Walkie] Remote talkie created.");
				}
			}

			[PunRPC]
			private void RPC_ShowRemoteTalkie(bool show)
			{
				if ((Object)(object)_talkieRemote != (Object)null)
				{
					_talkieRemote.SetActive(show);
				}
			}

			private void UpdateSfxVisibility()
			{
				float num = GetGameVolumeScalar() * 0.3f;
				if (Object.op_Implicit((Object)(object)_sfxOn))
				{
					_sfxOn.volume = num * 0.5f;
				}
				if (Object.op_Implicit((Object)(object)_sfxOff))
				{
					_sfxOff.volume = num * 0.5f;
				}
				if (Object.op_Implicit((Object)(object)_sfxIdle))
				{
					_sfxIdle.volume = num;
				}
				if (_usingRadio)
				{
					SetGoActive((Component)(object)_sfxOn, active: true);
					SetGoActive((Component)(object)_sfxOff, active: false);
					SetGoActive((Component)(object)_sfxIdle, active: true);
				}
				else
				{
					SetGoActive((Component)(object)_sfxOn, active: false);
					SetGoActive((Component)(object)_sfxOff, active: true);
					SetGoActive((Component)(object)_sfxIdle, active: false);
				}
			}

			private float GetGameVolumeScalar()
			{
				float num = 1f;
				float num2 = 1f;
				try
				{
					Type typeFromHandle = typeof(Setting);
					int num3 = TryGetEnumIndex(typeFromHandle, new string[4] { "MasterVolume", "Master_Volume", "MasterSound", "Master" }, 1);
					int num4 = TryGetEnumIndex(typeFromHandle, new string[6] { "SFXVolume", "SfxVolume", "SoundFXVolume", "EffectsVolume", "SoundEffects", "Effects" }, 13);
					num = 0.01f * Convert.ToSingle(DataDirector.instance.SettingValueFetch((Setting)num3));
					num2 = 0.01f * Convert.ToSingle(DataDirector.instance.SettingValueFetch((Setting)num4));
				}
				catch
				{
				}
				return Mathf.Clamp01(num * num2);
			}

			private static int TryGetEnumIndex(Type enumType, IEnumerable<string> names, int fallback)
			{
				foreach (string name in names)
				{
					try
					{
						if (Enum.IsDefined(enumType, name))
						{
							return Convert.ToInt32(Enum.Parse(enumType, name));
						}
					}
					catch
					{
					}
				}
				return fallback;
			}

			[PunRPC]
			private void RPC_SetVoiceRangeAndFilters(int maxDistance, bool talking)
			{
				AudioSource component = ((Component)this).GetComponent<AudioSource>();
				AudioLowPassLogic component2 = ((Component)this).GetComponent<AudioLowPassLogic>();
				if ((Object)(object)component2 != (Object)null)
				{
					component2.LogicActive = !talking;
					if (Object.op_Implicit((Object)(object)component2.AudioLowpassFilter))
					{
						component2.AudioLowpassFilter.cutoffFrequency = (talking ? component2.LowPassMax : 0f);
					}
				}
				AudioHighPassFilter val = ((Component)this).GetComponent<AudioHighPassFilter>() ?? ((Component)this).gameObject.AddComponent<AudioHighPassFilter>();
				val.cutoffFrequency = (talking ? 1000 : 10);
				if (Object.op_Implicit((Object)(object)component))
				{
					component.maxDistance = maxDistance;
				}
			}

			[PunRPC]
			private void RPC_SetTalkingFlag(int viewId, bool isTalking)
			{
				//IL_007c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0081: Unknown result type (might be due to invalid IL or missing references)
				//IL_008b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0090: Unknown result type (might be due to invalid IL or missing references)
				if (isTalking)
				{
					PlayersTalking.Add(viewId);
					if (((MonoBehaviourPun)this).photonView.IsMine || !_enemiesHear)
					{
						return;
					}
					WalkieController[] array = Object.FindObjectsOfType<WalkieController>();
					foreach (WalkieController walkieController in array)
					{
						if (((MonoBehaviourPun)walkieController).photonView.IsMine && (Object)(object)walkieController._localAvatar != (Object)null)
						{
							try
							{
								EnemyDirector.instance.SetInvestigate(((Component)walkieController._localAvatar).transform.position + Vector3.up * 0.2f, 5f, false);
								break;
							}
							catch
							{
								break;
							}
						}
					}
				}
				else
				{
					PlayersTalking.Remove(viewId);
				}
			}

			[PunRPC]
			private void RPC_SyncSettings(int maxBattery, bool recharge, bool enemiesHear, float rechargeRatePerSec)
			{
				MaxBattery = maxBattery;
				Recharge = recharge;
				EnemiesHear = enemiesHear;
				RechargeRatePerSec = rechargeRatePerSec;
				_maxBattery = maxBattery;
				_recharge = recharge;
				_enemiesHear = enemiesHear;
				_rechargeRatePerSec = rechargeRatePerSec;
				if (_battery > _maxBattery)
				{
					_battery = _maxBattery;
				}
				if (Object.op_Implicit((Object)(object)_batteryUi))
				{
					_batteryUi.Set(_battery, _maxBattery);
				}
			}

			[PunRPC]
			private void RPC_SetLocalAvatarViewId(int viewId)
			{
			}

			private static bool IsMasterOrSingle()
			{
				try
				{
					return SemiFunc.IsMasterClientOrSingleplayer();
				}
				catch
				{
					return PhotonNetwork.IsMasterClient || !PhotonNetwork.InRoom;
				}
			}

			private static bool IsInGame()
			{
				//IL_0014: Unknown result type (might be due to invalid IL or missing references)
				//IL_001a: Invalid comparison between Unknown and I4
				try
				{
					return (Object)(object)GameDirector.instance != (Object)null && (int)GameDirector.instance.currentState == 2 && SemiFunc.RunIsLevel();
				}
				catch
				{
					return Object.FindObjectsOfType<PlayerAvatar>().Length != 0;
				}
			}

			private void TryResolveKey(string cfg)
			{
				//IL_001a: Unknown result type (might be due to invalid IL or missing references)
				//IL_000f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0010: Unknown result type (might be due to invalid IL or missing references)
				if (Enum.TryParse<KeyCode>(cfg, ignoreCase: true, out KeyCode result))
				{
					_pushKey = result;
				}
				else
				{
					_pushKey = (KeyCode)118;
				}
			}

			private static AudioSource FindChildAudio(GameObject root, string childName)
			{
				if (!Object.op_Implicit((Object)(object)root))
				{
					return null;
				}
				Transform val = root.transform.Find(childName);
				return ((Object)(object)val != (Object)null) ? ((Component)val).GetComponent<AudioSource>() : null;
			}

			private static void SetGoActive(Component c, bool active)
			{
				if (!((Object)(object)c == (Object)null))
				{
					c.gameObject.SetActive(active);
				}
			}

			private static void SetWorldScale(Transform t, float worldScale)
			{
				//IL_003b: 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_009f: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
				if (!((Object)(object)t == (Object)null))
				{
					float num = Mathf.Clamp(worldScale, 0.001f, 5f);
					Transform parent = t.parent;
					float num2 = (Object.op_Implicit((Object)(object)parent) ? parent.lossyScale.x : 1f);
					if (Mathf.Approximately(num2, 0f))
					{
						num2 = 1f;
					}
					float num3 = (Object.op_Implicit((Object)(object)parent) ? parent.lossyScale.y : 1f);
					if (Mathf.Approximately(num3, 0f))
					{
						num3 = 1f;
					}
					float num4 = (Object.op_Implicit((Object)(object)parent) ? parent.lossyScale.z : 1f);
					if (Mathf.Approximately(num4, 0f))
					{
						num4 = 1f;
					}
					t.localScale = new Vector3(num / num2, num / num3, num / num4);
				}
			}

			private static Transform FindGrabberTarget(Transform avatarRoot)
			{
				if ((Object)(object)avatarRoot == (Object)null)
				{
					return null;
				}
				Transform val = avatarRoot.Find("[RIG]");
				Transform val2 = ((val != null) ? val.Find("Grabber Target") : null);
				if ((Object)(object)val2 != (Object)null)
				{
					return val2;
				}
				return FindDeepChildByName(avatarRoot, "Grabber Target");
			}

			private static Transform FindDeepChildByName(Transform parent, string name)
			{
				if ((Object)(object)parent == (Object)null)
				{
					return null;
				}
				for (int i = 0; i < parent.childCount; i++)
				{
					Transform child = parent.GetChild(i);
					if (string.Equals(((Object)child).name, name, StringComparison.OrdinalIgnoreCase))
					{
						return child;
					}
					Transform val = FindDeepChildByName(child, name);
					if ((Object)(object)val != (Object)null)
					{
						return val;
					}
				}
				return null;
			}
		}

		public class WalkieBatteryUI : MonoBehaviour
		{
			private TextMeshProUGUI _cur;

			private TextMeshProUGUI _max;

			private void Awake()
			{
				_cur = ((Component)this).GetComponent<TextMeshProUGUI>();
				Transform obj = ((Component)this).transform.Find("EnergyMax");
				_max = ((obj != null) ? ((Component)obj).GetComponent<TextMeshProUGUI>() : null);
			}

			public void Set(float value, float max)
			{
				if (Object.op_Implicit((Object)(object)_cur))
				{
					((TMP_Text)_cur).text = Mathf.Ceil(value).ToString();
				}
				if (Object.op_Implicit((Object)(object)_max))
				{
					((TMP_Text)_max).text = "<b>/</b>" + Mathf.Ceil(max);
				}
			}
		}

		internal static class AssetLoader
		{
			private static AssetBundle _bundle;

			private static string _loadedFor;

			public static GameObject GetPrefab(string prefabName, string bundleBase)
			{
				if ((Object)(object)_bundle == (Object)null || _loadedFor != bundleBase)
				{
					TryLoadBundle(bundleBase);
				}
				if ((Object)(object)_bundle == (Object)null)
				{
					return null;
				}
				GameObject val = _bundle.LoadAsset<GameObject>(prefabName);
				if ((Object)(object)val == (Object)null)
				{
					ManualLogSource log = Log;
					if (log != null)
					{
						log.LogError((object)("[Walkie] Prefab '" + prefabName + "' not found in bundle '" + bundleBase + "'."));
					}
				}
				return val;
			}

			private static void TryLoadBundle(string baseName)
			{
				Unload();
				string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
				string[] array = new string[4]
				{
					Path.Combine(directoryName, baseName),
					Path.Combine(directoryName, baseName + ".assetbundle"),
					Path.Combine(directoryName, baseName + ".unity3d"),
					Path.Combine(directoryName, baseName + ".bundle")
				};
				string[] array2 = array;
				foreach (string text in array2)
				{
					if (!File.Exists(text))
					{
						continue;
					}
					try
					{
						_bundle = AssetBundle.LoadFromFile(text);
						if ((Object)(object)_bundle != (Object)null)
						{
							_loadedFor = baseName;
							ManualLogSource log = Log;
							if (log != null)
							{
								log.LogInfo((object)("[Walkie] Loaded AssetBundle: " + Path.GetFileName(text)));
							}
							return;
						}
					}
					catch (Exception arg)
					{
						ManualLogSource log2 = Log;
						if (log2 != null)
						{
							log2.LogWarning((object)$"[Walkie] Failed to load bundle '{text}': {arg}");
						}
					}
				}
				ManualLogSource log3 = Log;
				if (log3 != null)
				{
					log3.LogError((object)("[Walkie] Could not find bundle '" + baseName + "' beside the DLL."));
				}
			}

			public static void Unload()
			{
				if ((Object)(object)_bundle != (Object)null)
				{
					try
					{
						_bundle.Unload(false);
					}
					catch
					{
					}
				}
				_bundle = null;
				_loadedFor = null;
			}
		}

		public const string PluginGuid = "omni.repo.walkietalkie";

		public const string PluginName = "Omni Walkie-Talkie";

		public const string PluginVersion = "1.2.0";

		internal static ManualLogSource Log;

		internal static ConfigEntry<string> CFG_TalkKey;

		internal static ConfigEntry<int> CFG_MaxBattery;

		internal static ConfigEntry<bool> CFG_Recharge;

		internal static ConfigEntry<float> CFG_RechargeRatePerSec;

		internal static ConfigEntry<bool> CFG_EnemiesHear;

		internal static ConfigEntry<float> CFG_WorldScale;

		internal static ConfigEntry<float> CFG_RollDegrees;

		internal static int MaxBattery = 40;

		internal static bool Recharge = true;

		internal static float RechargeRatePerSec = 1f;

		internal static bool EnemiesHear = true;

		private Harmony _harmony;

		private void Awake()
		{
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Expected O, but got Unknown
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Expected O, but got Unknown
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Expected O, but got Unknown
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Expected O, but got Unknown
			//IL_019f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a9: Expected O, but got Unknown
			Log = ((BaseUnityPlugin)this).Logger;
			CFG_TalkKey = ((BaseUnityPlugin)this).Config.Bind<string>("Controls", "PushToTalkKey", "V", "Key to hold for radio talk. Example: V, F, Mouse4, LeftShift");
			CFG_MaxBattery = ((BaseUnityPlugin)this).Config.Bind<int>("Battery (host only)", "MaxBattery", 50, new ConfigDescription("Walkie battery capacity.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(5, 200), Array.Empty<object>()));
			CFG_Recharge = ((BaseUnityPlugin)this).Config.Bind<bool>("Battery (host only)", "RechargeDuringLevel", true, "Recharge slowly when not transmitting.");
			CFG_RechargeRatePerSec = ((BaseUnityPlugin)this).Config.Bind<float>("Battery (host only)", "RechargeRatePerSec", 1f, new ConfigDescription("Units recovered per second when not transmitting (if RechargeDuringLevel=true).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 20f), Array.Empty<object>()));
			CFG_EnemiesHear = ((BaseUnityPlugin)this).Config.Bind<bool>("Enemies (host only)", "EnemiesHearRadio", true, "If true, enemy AI will get an investigate ping when a player transmits.");
			CFG_WorldScale = ((BaseUnityPlugin)this).Config.Bind<float>("Visual", "WorldScale", 0.05f, new ConfigDescription("World size of the radio model (meters). Compensates for parent scaling.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.005f, 1f), Array.Empty<object>()));
			CFG_RollDegrees = ((BaseUnityPlugin)this).Config.Bind<float>("Visual", "RollDegrees", 0f, new ConfigDescription("Roll (Z) degrees: local +roll, remote -roll. Set 0 to disable.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 45f), Array.Empty<object>()));
			MaxBattery = CFG_MaxBattery.Value;
			Recharge = CFG_Recharge.Value;
			RechargeRatePerSec = CFG_RechargeRatePerSec.Value;
			EnemiesHear = CFG_EnemiesHear.Value;
			_harmony = new Harmony("omni.repo.walkietalkie");
			_harmony.PatchAll(typeof(Patch_AttachController));
			_harmony.PatchAll(typeof(Patch_RightArmPose));
			Log.LogInfo((object)"[Omni Walkie-Talkie] Loaded.");
		}

		private void OnDestroy()
		{
			try
			{
				Harmony harmony = _harmony;
				if (harmony != null)
				{
					harmony.UnpatchSelf();
				}
			}
			catch
			{
			}
		}
	}
}
namespace Eggs
{
	[BepInPlugin("Omniscye.Eggs", "Eggs", "1.0")]
	public class Eggs : BaseUnityPlugin
	{
		internal static Eggs Instance { get; private set; }

		internal static ManualLogSource Logger => Instance._logger;

		private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger;

		internal Harmony? Harmony { get; set; }

		private void Awake()
		{
			Instance = this;
			((Component)this).gameObject.transform.parent = null;
			((Object)((Component)this).gameObject).hideFlags = (HideFlags)61;
			Patch();
			Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!");
		}

		internal void Patch()
		{
			//IL_001a: 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_0021: Expected O, but got Unknown
			//IL_0026: Expected O, but got Unknown
			if (Harmony == null)
			{
				Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID);
				Harmony val2 = val;
				Harmony = val;
			}
			Harmony.PatchAll();
		}

		internal void Unpatch()
		{
			Harmony? harmony = Harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
		}

		private void Update()
		{
		}
	}
}

plugins/EnemyOverhaul.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Events;

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

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace Ardot.REPO.EnemyOverhaul
{
	public static class Debug
	{
		public static void PrintTree(Transform root, bool printComponents = true, int maxDepth = -1, IEnumerable<MonoBehaviour> forceInclude = null)
		{
			List<char> message = new List<char>();
			Utils.ForObjectsInTree(root, delegate(Transform branch, int depth)
			{
				message.Add('\n');
				for (int i = 0; i < depth; i++)
				{
					message.AddRange("   |");
				}
				message.AddRange("- " + ((Object)((Component)branch).gameObject).name);
				if (printComponents)
				{
					message.AddRange(" -");
					int componentCount = ((Component)branch).gameObject.GetComponentCount();
					for (int j = 0; j < componentCount; j++)
					{
						message.AddRange($" {((object)((Component)branch).gameObject.GetComponentAtIndex(j)).GetType()},");
					}
					message.RemoveAt(message.Count - 1);
				}
			}, maxDepth, forceInclude);
			Plugin.Logger.LogInfo((object)new string(new ReadOnlySpan<char>(message.ToArray())));
		}
	}
	public class PlayerAggro
	{
		public PlayerAvatar Player;

		public float Aggro;
	}
	public class AggroHandler
	{
		public List<PlayerAggro> AggroList = new List<PlayerAggro>();

		public PlayerAggro GetHighestAggro()
		{
			PlayerAggro playerAggro = null;
			for (int i = 0; i < AggroList.Count; i++)
			{
				PlayerAggro playerAggro2 = AggroList[i];
				if (playerAggro == null || playerAggro2.Aggro > playerAggro.Aggro)
				{
					playerAggro = playerAggro2;
				}
			}
			return playerAggro;
		}

		public void LoseAggro(float amount)
		{
			for (int i = 0; i < AggroList.Count; i++)
			{
				AggroList[i].Aggro = Mathf.Max(AggroList[i].Aggro - amount, 0f);
			}
		}

		public PlayerAggro GetAggro(PlayerAvatar playerAvatar)
		{
			int num = -1;
			for (int i = 0; i < AggroList.Count; i++)
			{
				if ((Object)(object)AggroList[i].Player == (Object)(object)playerAvatar)
				{
					num = i;
					break;
				}
			}
			if (num == -1)
			{
				num = AggroList.Count;
				AggroList.Add(new PlayerAggro
				{
					Player = playerAvatar,
					Aggro = 0f
				});
			}
			return AggroList[num];
		}
	}
	public class OverhaulDirector : MonoBehaviour
	{
		[CompilerGenerated]
		private sealed class <GameOverCoroutine>d__12 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public OverhaulDirector <>4__this;

			private int <x>5__1;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <GameOverCoroutine>d__12(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_002f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0034: Unknown result type (might be due to invalid IL or missing references)
				//IL_005f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0069: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					SemiFunc.UIBigMessage("ESSENTIAL ASSETS DAMAGED", "{!}", 30f, Color.red, Color.red);
					BigMessageUI.instance.Set<BigMessageUI>("bigMessageTimer", 3f);
					<>2__current = (object)new WaitForSeconds(6f);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					<x>5__1 = 0;
					while (<x>5__1 < GameDirector.instance.PlayerList.Count)
					{
						GameDirector.instance.PlayerList[<x>5__1].PlayerDeath(-1);
						<x>5__1++;
					}
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		public static OverhaulDirector Instance;

		public bool ExtractionCompletedImpulse = false;

		public bool ExtractionUnlockedImpulse = false;

		public bool AllExtractionPointsCompleted = false;

		public int ExtractionOverflow = 0;

		public ExtractionPoint CurrentExtraction = null;

		public static void Init()
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Expected O, but got Unknown
			Plugin.Harmony.Patch((MethodBase)AccessTools.Method(typeof(GameDirector), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(OverhaulDirector), "AwakePostfix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}

		public static void AwakePostfix(GameDirector __instance)
		{
			((Component)__instance).gameObject.AddComponent<OverhaulDirector>();
		}

		public void Awake()
		{
			Instance = this;
		}

		public void Update()
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Invalid comparison between Unknown and I4
			ExtractionUnlockedImpulse = false;
			ExtractionCompletedImpulse = false;
			ExtractionPoint val = (ExtractionPoint)RoundDirector.instance.Get<RoundDirector>("extractionPointCurrent");
			if ((Object)(object)val != (Object)(object)CurrentExtraction && (!((Object)(object)val != (Object)null) || ((int)(State)val.Get<ExtractionPoint>("currentState") == 2 && !(bool)val.Get<ExtractionPoint>("stateStart"))))
			{
				if ((Object)(object)CurrentExtraction == (Object)null)
				{
					ExtractionUnlockedImpulse = true;
				}
				else
				{
					ExtractionCompletedImpulse = true;
				}
				CurrentExtraction = val;
				AllExtractionPointsCompleted = (bool)RoundDirector.instance.Get<RoundDirector>("allExtractionPointsCompleted");
			}
			if (ExtractionUnlockedImpulse)
			{
				AccessTools.Method(typeof(ExtractionPoint), "HaulGoalSet", (Type[])null, (Type[])null).Invoke(CurrentExtraction, new object[1] { (int)RoundDirector.instance.Get<RoundDirector>("haulGoal") / (int)RoundDirector.instance.Get<RoundDirector>("extractionPoints") + ExtractionOverflow * 12 / 10 });
				AccessTools.Method(typeof(ExtractionPoint), "SetHaulText", (Type[])null, (Type[])null).Invoke(CurrentExtraction, null);
				ExtractionOverflow = 0;
			}
		}

		public void DestroyExtractionPoint(ExtractionPoint extraction)
		{
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			((Behaviour)extraction).enabled = false;
			ExtractionOverflow += extraction.haulGoal;
			RoundDirector.instance.Set<RoundDirector>("extractionPointActive", false);
			RoundDirector.instance.ExtractionPointsUnlock();
			RoundDirector.instance.ExtractionCompleted();
			SemiFunc.StatSetRunCurrency(SemiFunc.StatGetRunCurrency() - 5);
			((SemiUI)CurrencyUI.instance).Show();
			CurrencyUI.instance.Set<CurrencyUI>("showTimer", 2f);
			int num = (int)RoundDirector.instance.Get<RoundDirector>("extractionPoints");
			int num2 = (int)RoundDirector.instance.Get<RoundDirector>("extractionPointsCompleted");
			if (num - num2 <= 0)
			{
				GameOver();
				return;
			}
			SemiFunc.UIBigMessage($"EXTRACTION DESTROYED\n${5000} FINED", "{!}", 25f, Color.red, Color.red);
			BigMessageUI.instance.Set<BigMessageUI>("bigMessageTimer", 3f);
		}

		public void GameOver()
		{
			((MonoBehaviour)this).StartCoroutine(GameOverCoroutine());
		}

		[IteratorStateMachine(typeof(<GameOverCoroutine>d__12))]
		public IEnumerator GameOverCoroutine()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <GameOverCoroutine>d__12(0)
			{
				<>4__this = this
			};
		}
	}
	public static class GnomeOverhaul
	{
		public static ConfigEntry<bool> OverhaulItemDamage;

		public static void Init()
		{
			OverhaulItemDamage = Plugin.BindConfig("Gnome", "OverhaulItemDamage", defaultValue: true, "If true, significantly reduces the damage that Gnomes do to items", delegate
			{
				//IL_0031: Unknown result type (might be due to invalid IL or missing references)
				//IL_003b: Expected O, but got Unknown
				Plugin.SetPatch(OverhaulItemDamage.Value, AccessTools.Method(typeof(EnemyGnome), "Start", (Type[])null, (Type[])null), null, new HarmonyMethod(typeof(GnomeOverhaul), "StartPostfix", (Type[])null));
			});
		}

		public static void StartPostfix(EnemyGnome __instance)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			List<HurtCollider> hurtColliders = Utils.GetHurtColliders(((Component)((Component)__instance.enemy).GetComponentInParent<EnemyParent>()).transform);
			for (int i = 0; i < hurtColliders.Count; i++)
			{
				HurtCollider val = hurtColliders[i];
				val.physImpact = (BreakImpact)1;
			}
		}
	}
	public static class HeadmanOverhaul
	{
		private enum HeadmanState
		{
			Roaming,
			Interested,
			Annoyed,
			VeryAnnoyed,
			Pissed
		}

		private const int VisionTimerMeta = 0;

		private const int LastVisionTime = 1;

		private const int State = 2;

		private const int Started = 3;

		private const int HurtColliders = 4;

		public static ConfigEntry<bool> OverhaulAI;

		public static void Init()
		{
			OverhaulAI = Plugin.BindConfig("Headman", "OverhaulAI", defaultValue: true, "If true, Headman AI is overhauled", delegate
			{
				//IL_0031: Unknown result type (might be due to invalid IL or missing references)
				//IL_003c: Expected O, but got Unknown
				//IL_006e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0078: Expected O, but got Unknown
				Plugin.SetPatch(OverhaulAI.Value, AccessTools.Method(typeof(EnemyHeadController), "VisionTriggered", (Type[])null, (Type[])null), new HarmonyMethod(typeof(HeadmanOverhaul), "VisionTriggeredPrefix", (Type[])null));
				Plugin.SetPatch(OverhaulAI.Value, AccessTools.Method(typeof(EnemyHeadController), "Update", (Type[])null, (Type[])null), null, new HarmonyMethod(typeof(HeadmanOverhaul), "UpdatePostfix", (Type[])null));
			});
		}

		public static void Start(EnemyHeadController instance, Enemy enemy)
		{
			((MonoBehaviour)(object)instance).SetMetadata(4, Utils.GetHurtColliders(((Component)enemy.Get<EnemyParent, Enemy>("EnemyParent")).transform));
		}

		public static void UpdatePostfix(EnemyHeadController __instance, Enemy ___Enemy)
		{
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Invalid comparison between Unknown and I4
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Invalid comparison between Unknown and I4
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
			if (!((MonoBehaviour)(object)__instance).GetMetadata(3, defaultValue: false))
			{
				((MonoBehaviour)(object)__instance).SetMetadata(3, true);
				Start(__instance, ___Enemy);
			}
			HeadmanState headmanState = ((MonoBehaviour)(object)__instance).GetMetadata(2, HeadmanState.Roaming);
			float metadata = ((MonoBehaviour)(object)__instance).GetMetadata(0, 0f);
			EnemyVision obj = (EnemyVision)___Enemy.Get<Enemy>("Vision");
			PlayerAvatar val = obj.Get<PlayerAvatar, EnemyVision>("onVisionTriggeredPlayer");
			EnemyStateInvestigate component = ((Component)__instance).GetComponent<EnemyStateInvestigate>();
			if ((int)___Enemy.CurrentState == 4 || (int)___Enemy.CurrentState == 5)
			{
				List<HurtCollider> metadata2 = ((MonoBehaviour)(object)__instance).GetMetadata<List<HurtCollider>>(4);
				for (int i = 0; i < metadata2.Count; i++)
				{
					metadata2[i].playerDamage = 80;
				}
				SetMovement(__instance, ___Enemy, 12f, 20f);
			}
			else
			{
				SetMovement(__instance, ___Enemy, 6f, 10f);
			}
			switch (headmanState)
			{
			case HeadmanState.Roaming:
				if (metadata > 0.1f)
				{
					component.Set(Vector3.Lerp(((Component)__instance).transform.position, val.playerTransform.position, 0.2f));
					headmanState = HeadmanState.Interested;
				}
				break;
			case HeadmanState.Interested:
				if (metadata > 0.2f)
				{
					component.Set(Vector3.Lerp(((Component)__instance).transform.position, val.playerTransform.position, 0.2f));
					AccessTools.Method(typeof(EnemyHeadAnimationSystem), "IdleTeeth", (Type[])null, (Type[])null).Invoke(__instance.AnimationSystem, Array.Empty<object>());
					headmanState = HeadmanState.Annoyed;
				}
				if (metadata < 0.1f)
				{
					headmanState = HeadmanState.Roaming;
				}
				break;
			case HeadmanState.Annoyed:
				if (metadata > 0.4f)
				{
					component.Set(Vector3.Lerp(((Component)__instance).transform.position, val.playerTransform.position, 0.2f));
					AccessTools.Method(typeof(EnemyHeadAnimationSystem), "IdleTeeth", (Type[])null, (Type[])null).Invoke(__instance.AnimationSystem, Array.Empty<object>());
					headmanState = HeadmanState.VeryAnnoyed;
				}
				if (metadata < 0.2f)
				{
					headmanState = HeadmanState.Interested;
				}
				break;
			case HeadmanState.VeryAnnoyed:
				if (metadata > 0.7f)
				{
					headmanState = HeadmanState.Pissed;
				}
				if (metadata < 0.4f)
				{
					headmanState = HeadmanState.Annoyed;
				}
				break;
			case HeadmanState.Pissed:
				if (metadata < 0.5f)
				{
					headmanState = HeadmanState.Roaming;
				}
				break;
			}
			((MonoBehaviour)(object)__instance).SetMetadata(2, headmanState);
			float metadata3 = ((MonoBehaviour)(object)__instance).GetMetadata(1, 0f);
			if (!(Time.time - metadata3 < 0.5f))
			{
				metadata = Mathf.Max(metadata - 0.2f * Time.deltaTime, 0f);
				((MonoBehaviour)(object)__instance).SetMetadata(0, metadata);
			}
		}

		public static bool VisionTriggeredPrefix(EnemyHeadController __instance, Enemy ___Enemy)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Invalid comparison between Unknown and I4
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Invalid comparison between Unknown and I4
			//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ad: Invalid comparison between Unknown and I4
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Invalid comparison between Unknown and I4
			//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b7: Invalid comparison between Unknown and I4
			//IL_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Invalid comparison between Unknown and I4
			//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d0: Invalid comparison between Unknown and I4
			//IL_01da: Unknown result type (might be due to invalid IL or missing references)
			//IL_0214: Unknown result type (might be due to invalid IL or missing references)
			//IL_021a: Invalid comparison between Unknown and I4
			//IL_0297: Unknown result type (might be due to invalid IL or missing references)
			//IL_027c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0250: Unknown result type (might be due to invalid IL or missing references)
			//IL_0247: Unknown result type (might be due to invalid IL or missing references)
			EnemyVision obj = (EnemyVision)___Enemy.Get<Enemy>("Vision");
			PlayerAvatar val = obj.Get<PlayerAvatar, EnemyVision>("onVisionTriggeredPlayer");
			___Enemy.Set<Enemy>("TargetPlayerViewID", val.photonView.ViewID);
			___Enemy.Set<Enemy>("TargetPlayerAvatar", val);
			PhysGrabber physGrabber = val.physGrabber;
			Rigidbody val2 = physGrabber.Get<Rigidbody, PhysGrabber>("grabbedObject");
			if ((Object)(object)val2 == (Object)null || (float)___Enemy.Get<Enemy>("DisableChaseTimer") > 0f)
			{
				return false;
			}
			HeadmanState metadata = ((MonoBehaviour)(object)__instance).GetMetadata(2, HeadmanState.Roaming);
			float metadata2 = ((MonoBehaviour)(object)__instance).GetMetadata(0, 0f);
			float num = (float)obj.Get<EnemyVision>("VisionCheckTime");
			float num2 = 0f;
			ValuableObject component = ((Component)val2).GetComponent<ValuableObject>();
			if (component != null)
			{
				num2 = component.dollarValueCurrent / 1500f;
			}
			else
			{
				ItemAttributes component2 = ((Component)val2).GetComponent<ItemAttributes>();
				if (component2 != null && ((int)component2.item.itemType == 6 || (int)component2.item.itemType == 7 || (int)component2.item.itemType == 9 || (int)component2.item.itemType == 11))
				{
					num2 = 4f;
				}
			}
			metadata2 = Mathf.Min(metadata2 + num * num2 / Vector3.Distance(val.playerTransform.position, ((Component)__instance).transform.position), 1f);
			((MonoBehaviour)(object)__instance).SetMetadata(1, Time.time);
			((MonoBehaviour)(object)__instance).SetMetadata(0, metadata2);
			if (metadata != HeadmanState.Pissed)
			{
				return false;
			}
			if ((int)___Enemy.CurrentState != 4 && (int)___Enemy.CurrentState != 10)
			{
				if ((int)___Enemy.CurrentState == 5)
				{
					___Enemy.CurrentState = (EnemyState)4;
				}
				else if ((bool)obj.Get<EnemyVision>("onVisionTriggeredCulled") && !(bool)obj.Get<EnemyVision>("onVisionTriggeredNear"))
				{
					if ((int)___Enemy.CurrentState != 8)
					{
						if (Random.Range(0f, 100f) <= 30f)
						{
							___Enemy.CurrentState = (EnemyState)3;
						}
						else
						{
							___Enemy.CurrentState = (EnemyState)8;
						}
					}
				}
				else if ((float)obj.Get<EnemyVision>("onVisionTriggeredDistance") >= 7f)
				{
					___Enemy.CurrentState = (EnemyState)4;
					___Enemy.Get<EnemyStateChase, Enemy>("StateChase").ChaseCanReach = true;
				}
				else
				{
					___Enemy.CurrentState = (EnemyState)3;
				}
			}
			return false;
		}

		public static void SetMovement(EnemyHeadController instance, Enemy enemy, float speed, float acceleration)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			EnemyRigidbody val = (EnemyRigidbody)enemy.Get<Enemy>("Rigidbody");
			EnemyStateChase component = ((Component)instance).GetComponent<EnemyStateChase>();
			val.OverrideFollowPosition(1f, speed, -1f);
			component.Speed = speed;
			component.Acceleration = acceleration;
			instance.Visual.PositionFollowChasing = speed;
		}
	}
	public static class HuntsmanOverhaul
	{
		public static ConfigEntry<bool> OverhaulAI;

		public static ConfigEntry<bool> OverhaulDamageFalloff;

		public static ConfigEntry<bool> OverhaulTargetPlayerItems;

		public static void Init()
		{
			OverhaulAI = Plugin.BindConfig("Huntsman", "OverhaulAI", defaultValue: true, "If true, Huntsman AI is overhauled", delegate
			{
				//IL_0032: Unknown result type (might be due to invalid IL or missing references)
				//IL_003c: Expected O, but got Unknown
				//IL_006d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0078: Expected O, but got Unknown
				//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b4: Expected O, but got Unknown
				//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f0: Expected O, but got Unknown
				//IL_0121: Unknown result type (might be due to invalid IL or missing references)
				//IL_012c: Expected O, but got Unknown
				Plugin.SetPatch(OverhaulAI.Value, AccessTools.Method(typeof(EnemyHunter), "Awake", (Type[])null, (Type[])null), null, new HarmonyMethod(typeof(HuntsmanOverhaul), "AwakePostfix", (Type[])null));
				Plugin.SetPatch(OverhaulAI.Value, AccessTools.Method(typeof(EnemyHunter), "OnInvestigate", (Type[])null, (Type[])null), new HarmonyMethod(typeof(HuntsmanOverhaul), "OnInvestigatePrefix", (Type[])null));
				Plugin.SetPatch(OverhaulAI.Value, AccessTools.Method(typeof(EnemyHunter), "StateAim", (Type[])null, (Type[])null), new HarmonyMethod(typeof(HuntsmanOverhaul), "StateAimPrefix", (Type[])null));
				Plugin.SetPatch(OverhaulAI.Value, AccessTools.Method(typeof(EnemyHunter), "Update", (Type[])null, (Type[])null), null, new HarmonyMethod(typeof(HuntsmanOverhaul), "UpdatePostfix", (Type[])null));
				Plugin.SetPatch(OverhaulAI.Value, AccessTools.Method(typeof(EnemyHunter), "UpdateState", (Type[])null, (Type[])null), new HarmonyMethod(typeof(HuntsmanOverhaul), "UpdateStatePrefix", (Type[])null));
			});
			OverhaulDamageFalloff = Plugin.BindConfig("Huntsman", "OverhaulDamageFalloff", defaultValue: true, "If true, Huntsman damage reduces over long distances and increases at short range", delegate
			{
				//IL_0031: Unknown result type (might be due to invalid IL or missing references)
				//IL_003b: Expected O, but got Unknown
				Plugin.SetPatch(OverhaulDamageFalloff.Value, AccessTools.Method(typeof(EnemyHunter), "ShootRPC", (Type[])null, (Type[])null), null, new HarmonyMethod(typeof(HuntsmanOverhaul), "HunterShootRPCPostFix", (Type[])null));
			});
			OverhaulTargetPlayerItems = Plugin.BindConfig("Huntsman", "OverhaulTargetPlayerItems", defaultValue: true, "If true, Huntsman shoot directly at valuables that touch it, not the players holding those valuables.", delegate
			{
				//IL_0032: Unknown result type (might be due to invalid IL or missing references)
				//IL_003c: Expected O, but got Unknown
				//IL_006e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0078: Expected O, but got Unknown
				Plugin.SetPatch(OverhaulTargetPlayerItems.Value, AccessTools.Method(typeof(EnemyHunter), "OnTouchPlayerGrabbedObject", (Type[])null, (Type[])null), null, new HarmonyMethod(typeof(HuntsmanOverhaul), "HunterOnTouchPlayerGrabbedObjectPostfix", (Type[])null));
				Plugin.SetPatch(OverhaulTargetPlayerItems.Value, AccessTools.Method(typeof(EnemyRigidbody), "OnCollisionStay", (Type[])null, (Type[])null), null, new HarmonyMethod(typeof(HuntsmanOverhaul), "EnemyOnCollisionStayPostfix", (Type[])null));
			});
		}

		public static void AwakePostfix(EnemyHunter __instance)
		{
			HuntsmanOverhaulState huntsmanOverhaulState = ((Component)__instance).gameObject.AddComponent<HuntsmanOverhaulState>();
			huntsmanOverhaulState.Hunter = __instance;
		}

		public static void UpdateStatePrefix(EnemyHunter __instance, State _state)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Invalid comparison between Unknown and I4
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Invalid comparison between Unknown and I4
			HuntsmanOverhaulState component = ((Component)__instance).GetComponent<HuntsmanOverhaulState>();
			if ((int)_state != 3 && (int)__instance.currentState != 3)
			{
				component.InvestigateFrames = 0;
			}
		}

		public static void UpdatePostfix(EnemyHunter __instance)
		{
			HuntsmanOverhaulState component = ((Component)__instance).GetComponent<HuntsmanOverhaulState>();
			component.InvestigateFrames--;
		}

		public static void OnInvestigatePrefix(EnemyHunter __instance)
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Invalid comparison between Unknown and I4
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: 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)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			HuntsmanOverhaulState component = ((Component)__instance).GetComponent<HuntsmanOverhaulState>();
			if (!SemiFunc.IsMasterClientOrSingleplayer() || !((float)component.EnemyRigidbody.Get<EnemyRigidbody>("timeSinceStun") > 1.5f))
			{
				return;
			}
			component.InvestigateFrames = 2;
			if ((int)__instance.currentState == 5 && component.InvestigateCooldown <= 0f)
			{
				component.InvestigateTriggeredImpulse = true;
				Vector3 val = (Vector3)component.StateInvestigate.Get<EnemyStateInvestigate>("onInvestigateTriggeredPosition");
				__instance.Set<EnemyHunter>("investigatePoint", val);
				__instance.Set<EnemyHunter>("shootFast", Vector3.Distance(val, ((Component)component).transform.position) < 4f);
				component.InvestigateTransformGet();
				if (SemiFunc.IsMultiplayer())
				{
					component.PhotonView.RPC("UpdateInvestigationPoint", (RpcTarget)1, new object[1] { val });
				}
			}
		}

		public static bool StateAimPrefix(EnemyHunter __instance)
		{
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_010f: Unknown result type (might be due to invalid IL or missing references)
			HuntsmanOverhaulState component = ((Component)__instance).GetComponent<HuntsmanOverhaulState>();
			if (component.InvestigateFrames <= 0)
			{
				return true;
			}
			float num = (float)__instance.Get<EnemyHunter>("stateTimer");
			component.InvestigateFrames = 2;
			if ((bool)__instance.Get<EnemyHunter>("stateImpulse"))
			{
				component.EnemyNavAgent.Warp(((Component)component.EnemyRigidbody).transform.position);
				component.EnemyNavAgent.ResetPath();
				__instance.Set<EnemyHunter>("stateImpulse", false);
				num = 5f;
				component.InvestigateCooldown = 1f;
				__instance.Set<EnemyHunter>("investigatePointTransform", null);
				__instance.Set<EnemyHunter>("investigatePointHasTransform", false);
			}
			if (component.InvestigateTriggeredImpulse && !component.Aiming)
			{
				component.InvestigateTriggeredImpulse = false;
				component.Aiming = true;
				component.InvestigateCooldown = 0.5f;
				num = 0.5f;
				__instance.Set<EnemyHunter>("investigatePointSpread", Vector3.zero);
				__instance.Set<EnemyHunter>("investigatePointSpreadTarget", Vector3.zero);
				__instance.Set<EnemyHunter>("investigatePointSpreadTimer", 0f);
			}
			num -= Time.deltaTime;
			if (num <= 0f)
			{
				if (component.Aiming)
				{
					component.Aiming = false;
					component.UpdateState((State)6);
				}
				else
				{
					component.Animator.CrossFade("Leave Start", 1f);
					component.UpdateState((State)8);
				}
			}
			__instance.Set<EnemyHunter>("stateTimer", num);
			return false;
		}

		public static void HunterOnTouchPlayerGrabbedObjectPostfix(EnemyHunter __instance)
		{
			AccessTools.Field(typeof(EnemyHunter), "investigatePointHasTransform").SetValue(__instance, false);
		}

		public static void HunterShootRPCPostFix(EnemyHunter __instance, Vector3 _hitPosition)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			float num = Mathf.Min(2f / Mathf.Pow(Vector3.Distance(_hitPosition, __instance.gunTipTransform.position), 1.5f), 0.5f);
			__instance.hurtCollider.playerDamage = (int)(300f * num);
			__instance.hurtCollider.playerTumbleForce = 30f * num;
			__instance.hurtCollider.playerTumbleTorque = 30f * num;
			__instance.hurtCollider.playerHitForce = 30f * num;
			__instance.hurtCollider.playerTumbleTime = 6f * num;
			__instance.hurtCollider.enemyDamage = (int)(300f * num);
			__instance.hurtCollider.enemyHitForce = 30f * num;
			__instance.hurtCollider.enemyHitTorque = 60f * num;
		}

		public static void EnemyOnCollisionStayPostfix(EnemyRigidbody __instance, Collision other)
		{
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			if (other.gameObject.CompareTag("Phys Grab Object"))
			{
				PhysGrabObject val = other.gameObject.GetComponent<PhysGrabObject>();
				if (!Object.op_Implicit((Object)(object)val))
				{
					val = other.gameObject.GetComponentInParent<PhysGrabObject>();
				}
				if (Object.op_Implicit((Object)(object)val) && !__instance.enemy.CheckChase() && val.playerGrabbing.Count > 0)
				{
					__instance.Set<EnemyRigidbody>("onTouchPlayerGrabbedObjectPosition", other.transform.position);
				}
			}
		}
	}
	public class HuntsmanOverhaulState : MonoBehaviour
	{
		public EnemyHunter Hunter;

		public EnemyHunterAnim EnemyAnim;

		public Animator Animator;

		public Enemy Enemy;

		public EnemyNavMeshAgent EnemyNavAgent;

		public EnemyRigidbody EnemyRigidbody;

		public EnemyStateInvestigate StateInvestigate;

		public PhotonView PhotonView;

		public Action<State> UpdateState;

		public Action InvestigateTransformGet;

		public bool InvestigateTriggeredImpulse;

		public float InvestigateCooldown;

		public bool Aiming;

		public int InvestigateFrames;

		public void Awake()
		{
			EnemyNavAgent = ((Component)this).GetComponent<EnemyNavMeshAgent>();
			PhotonView = ((Component)this).GetComponent<PhotonView>();
			StateInvestigate = ((Component)this).GetComponent<EnemyStateInvestigate>();
			Enemy = ((Component)this).GetComponent<Enemy>();
		}

		public void Start()
		{
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Expected O, but got Unknown
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Expected O, but got Unknown
			UpdateState = (Action<State>)AccessTools.Method(typeof(EnemyHunter), "UpdateState", (Type[])null, (Type[])null).CreateDelegate(typeof(Action<State>), Hunter);
			InvestigateTransformGet = (Action)AccessTools.Method(typeof(EnemyHunter), "InvestigateTransformGet", (Type[])null, (Type[])null).CreateDelegate(typeof(Action), Hunter);
			EnemyAnim = Hunter.enemyHunterAnim;
			Animator = (Animator)EnemyAnim.Get<EnemyHunterAnim>("animator");
			EnemyRigidbody = (EnemyRigidbody)Enemy.Get<Enemy>("Rigidbody");
		}

		public void Update()
		{
			InvestigateCooldown -= Time.deltaTime;
		}
	}
	public static class PitOverhaul
	{
		public const int MapHurtColliderMeta = 0;

		public static ConfigEntry<bool> OverhaulPlayers;

		public static ConfigEntry<bool> OverhaulEnemies;

		public static ConfigEntry<bool> OverhaulItems;

		public static void Init()
		{
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Expected O, but got Unknown
			OverhaulPlayers = Plugin.BindConfig("Pits", "OverhaulPlayers", defaultValue: true, "If true, pit overhauled mechanics are applied to players", delegate
			{
				//IL_0030: Unknown result type (might be due to invalid IL or missing references)
				//IL_003b: Expected O, but got Unknown
				Plugin.SetPatch(OverhaulPlayers.Value, AccessTools.Method(typeof(HurtCollider), "PlayerHurt", (Type[])null, (Type[])null), new HarmonyMethod(typeof(PitOverhaul), "PlayerHurtPrefix", (Type[])null));
			});
			OverhaulEnemies = Plugin.BindConfig("Pits", "OverhaulEnemies", defaultValue: true, "If true, pit overhauled mechanics are applied to enemies", delegate
			{
				//IL_0030: Unknown result type (might be due to invalid IL or missing references)
				//IL_003b: Expected O, but got Unknown
				Plugin.SetPatch(OverhaulEnemies.Value, AccessTools.Method(typeof(HurtCollider), "EnemyHurt", (Type[])null, (Type[])null), new HarmonyMethod(typeof(PitOverhaul), "EnemyHurtPrefix", (Type[])null));
			});
			OverhaulItems = Plugin.BindConfig("Pits", "OverhaulItems", defaultValue: true, "If true, pit overhauled mechanics are applied to items", delegate
			{
				//IL_0030: Unknown result type (might be due to invalid IL or missing references)
				//IL_003b: Expected O, but got Unknown
				Plugin.SetPatch(OverhaulItems.Value, AccessTools.Method(typeof(HurtCollider), "PhysObjectHurt", (Type[])null, (Type[])null), new HarmonyMethod(typeof(PitOverhaul), "PhysObjectHurtPrefix", (Type[])null));
			});
			Plugin.Harmony.Patch((MethodBase)AccessTools.Method(typeof(LevelGenerator), "GenerateDone", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(PitOverhaul), "GenerateDonePostfix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}

		public static void GenerateDonePostfix(LevelGenerator __instance)
		{
			if ((Object)(object)RunManager.instance.levelCurrent == (Object)(object)RunManager.instance.levelArena)
			{
				return;
			}
			List<HurtCollider> hurtColliders = Utils.GetHurtColliders(__instance.LevelParent.transform);
			for (int i = 0; i < hurtColliders.Count; i++)
			{
				HurtCollider val = hurtColliders[i];
				if (((Object)val).name.Contains("Kill Box"))
				{
					((MonoBehaviour)(object)val).SetMetadata(0, true);
				}
			}
		}

		public static bool PlayerHurtPrefix(HurtCollider __instance, PlayerAvatar _player)
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Expected O, but got Unknown
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			if (!((MonoBehaviour)(object)__instance).GetMetadata(0, defaultValue: false))
			{
				return true;
			}
			__instance.onImpactAny.Invoke();
			__instance.onImpactPlayer.Invoke();
			LevelPoint val = Utils.ChooseLevelPoint(((Component)_player).transform.position, 40f, 1f);
			Vector3 val2 = ((Component)val).transform.position + new Vector3(0f, 1f, 0f);
			_player.Spawn(val2, ((Component)_player).transform.rotation);
			Rigidbody val3 = (Rigidbody)_player.tumble.Get<PlayerTumble>("rb");
			val3.position = val2;
			((Component)val3).transform.position = val2;
			PlayerController.instance.CollisionController.Set<PlayerCollisionController>("fallDistance", 0);
			_player.tumble.TumbleRequest(true, false);
			_player.tumble.TumbleOverrideTime(3f);
			_player.tumble.ImpactHurtSet(float.PositiveInfinity, Random.Range(35, 45));
			return false;
		}

		public static bool EnemyHurtPrefix(HurtCollider __instance, Enemy _enemy)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: 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_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Expected O, but got Unknown
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Expected O, but got Unknown
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			if (!((MonoBehaviour)(object)__instance).GetMetadata(0, defaultValue: false))
			{
				return true;
			}
			__instance.onImpactAny.Invoke();
			__instance.onImpactEnemy.Invoke();
			LevelPoint val = Utils.ChooseLevelPoint(((Component)_enemy).transform.position, 30f, 1f);
			Vector3 val2 = ((Component)val).transform.position + new Vector3(0f, 1f, 0f);
			_enemy.EnemyTeleported(val2);
			EnemyHealth val3 = (EnemyHealth)_enemy.Get<Enemy>("Health");
			if ((Object)(object)val3 != (Object)null)
			{
				val3.Hurt(Random.Range(100, 145), ((Component)__instance).transform.forward);
			}
			else if ((bool)_enemy.Get<Enemy>("HasStateDespawn"))
			{
				_enemy.Get<EnemyParent, Enemy>("EnemyParent").SpawnedTimerSet(0f);
				_enemy.CurrentState = (EnemyState)11;
			}
			EnemyStateStunned val4 = (EnemyStateStunned)_enemy.Get<Enemy>("StateStunned");
			if ((Object)(object)val4 != (Object)null)
			{
				val4.Set(5f);
			}
			return false;
		}

		public static bool PhysObjectHurtPrefix(ref bool __result, HurtCollider __instance, PhysGrabObject physGrabObject)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			if (!((MonoBehaviour)(object)__instance).GetMetadata(0, defaultValue: false))
			{
				return true;
			}
			LevelPoint val = Utils.ChooseLevelPoint(((Component)physGrabObject).transform.position, 20f, 1f);
			Vector3 val2 = ((Component)val).transform.position + new Vector3(0f, 1f, 0f);
			physGrabObject.Teleport(val2, ((Component)physGrabObject).transform.rotation);
			__result = true;
			return false;
		}
	}
	public static class ReaperOverhaul
	{
		public static ConfigEntry<bool> OverhaulAI;

		public static void Init()
		{
			OverhaulAI = Plugin.BindConfig("Reaper", "OverhaulAI", defaultValue: true, "If true, overhauls the AI of the Reaper", delegate
			{
				//IL_0031: Unknown result type (might be due to invalid IL or missing references)
				//IL_003c: Expected O, but got Unknown
				//IL_006e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0078: Expected O, but got Unknown
				//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b4: Expected O, but got Unknown
				//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f0: Expected O, but got Unknown
				Plugin.SetPatch(OverhaulAI.Value, AccessTools.Method(typeof(EnemyRunner), "StateAttackPlayer", (Type[])null, (Type[])null), new HarmonyMethod(typeof(ReaperOverhaul), "StateAttackPlayerPrefix", (Type[])null));
				Plugin.SetPatch(OverhaulAI.Value, AccessTools.Method(typeof(EnemyRunner), "Awake", (Type[])null, (Type[])null), null, new HarmonyMethod(typeof(ReaperOverhaul), "AwakePostfix", (Type[])null));
				Plugin.SetPatch(OverhaulAI.Value, AccessTools.Method(typeof(EnemyRunner), "OnHurt", (Type[])null, (Type[])null), null, new HarmonyMethod(typeof(ReaperOverhaul), "OnHurtPostfix", (Type[])null));
				Plugin.SetPatch(OverhaulAI.Value, AccessTools.Method(typeof(EnemyRunner), "StateLeave", (Type[])null, (Type[])null), null, new HarmonyMethod(typeof(ReaperOverhaul), "StateLeavePostfix", (Type[])null));
			});
		}

		public static void StateLeavePostfix(EnemyRunner __instance)
		{
			ReaperOverhaulState component = ((Component)__instance).GetComponent<ReaperOverhaulState>();
			if (component.RunningTimer > 0f)
			{
				component.OverrideMovement(3f, 5f, 6f, 0.2f);
			}
		}

		public static void AwakePostfix(EnemyRunner __instance)
		{
			ReaperOverhaulState reaperOverhaulState = ((Component)__instance).gameObject.AddComponent<ReaperOverhaulState>();
			reaperOverhaulState.Reaper = __instance;
			reaperOverhaulState.Enemy = ((Component)__instance).GetComponent<Enemy>();
			reaperOverhaulState.UpdateState = (Action<State>)AccessTools.Method(typeof(EnemyRunner), "UpdateState", (Type[])null, (Type[])null).CreateDelegate(typeof(Action<State>), __instance);
			reaperOverhaulState.VisionBlocked = (Func<bool>)AccessTools.Method(typeof(EnemyRunner), "VisionBlocked", (Type[])null, (Type[])null).CreateDelegate(typeof(Func<bool>), __instance);
		}

		public static void OnHurtPostfix(EnemyRunner __instance)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Invalid comparison between Unknown and I4
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			State currentState = __instance.currentState;
			State val = currentState;
			if (val - 7 <= 2)
			{
				ReaperOverhaulState component = ((Component)__instance).GetComponent<ReaperOverhaulState>();
				int num = component.PrevHealth - (int)component.EnemyHealth.Get<EnemyHealth>("healthCurrent");
				component.Aggro -= num;
				if (component.Aggro <= 0f)
				{
					component.UpdateState((State)16);
					component.HurtAggroCooldown = 3f;
					component.RunningTimer = 5f;
					component.EnemyAnim.sfxJump.Play(((Component)__instance).transform.position, 1.5f, 1f, 1f, 1f);
				}
			}
		}

		public static bool StateAttackPlayerPrefix(EnemyRunner __instance)
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Expected O, but got Unknown
			//IL_019f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0187: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0220: Unknown result type (might be due to invalid IL or missing references)
			//IL_0230: Unknown result type (might be due to invalid IL or missing references)
			//IL_0235: Unknown result type (might be due to invalid IL or missing references)
			//IL_0289: Unknown result type (might be due to invalid IL or missing references)
			//IL_0294: Unknown result type (might be due to invalid IL or missing references)
			//IL_0299: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_030d: Unknown result type (might be due to invalid IL or missing references)
			ReaperOverhaulState component = ((Component)__instance).GetComponent<ReaperOverhaulState>();
			if (component.HurtAggroCooldown > 0f)
			{
				component.UpdateState((State)16);
				return false;
			}
			PlayerAvatar val = (PlayerAvatar)__instance.Get<EnemyRunner>("targetPlayer");
			bool flag = (bool)__instance.Get<EnemyRunner>("stateImpulse");
			float num = (float)__instance.Get<EnemyRunner>("stateTimer");
			if (flag)
			{
				__instance.Set<EnemyRunner>("stateImpulse", false);
				__instance.Set<EnemyRunner>("stateTimer", 2f);
				num = 2f;
				component.RetargetTimer = 0f;
				component.ChaseTime = 0f;
			}
			component.Aggro += Time.deltaTime;
			component.ChaseTime += Time.deltaTime;
			component.RetargetTimer -= Time.deltaTime;
			if (component.RetargetTimer <= 0f)
			{
				component.RetargetTimer = 0.2f;
				if ((bool)val.tumble.Get<PlayerTumble>("isTumbling"))
				{
					component.SetPlayerDamage((int)component.ChaseTime);
				}
				else
				{
					component.SetPlayerDamage((int)component.ChaseTime + 10);
				}
				float num2 = 1f + component.ChaseTime / 5f;
				component.OverrideMovement(num2, num2 * 3f, num2 * 3f, 0.25f);
				component.EnemyNavAgent.SetDestination(((Component)val).transform.position);
			}
			if (!component.EnemyNavAgent.CanReach(((Component)val).transform.position, 0.25f) && Vector3.Distance(((Component)component.EnemyRigidbody).transform.position, component.EnemyNavAgent.GetPoint()) < 2f && ((Component)val).transform.position.y > ((Component)component.EnemyRigidbody).transform.position.y - 0.8f)
			{
				component.EnemyJump.StuckTrigger(((Component)val).transform.position - component.EnemyVision.VisionTransform.position);
			}
			if (!(bool)component.EnemyJump.Get<EnemyJump>("jumping") && (float)component.EnemyRigidbody.Get<EnemyRigidbody>("notMovingTimer") > 2f)
			{
				component.EnemyJump.StuckTrigger(((Component)val).transform.position - component.FeetTransform.position);
			}
			if (num > 1.5f && (bool)val.Get<PlayerAvatar>("isCrawling") && !(bool)val.Get<PlayerAvatar>("isTumbling") && (double)Vector3.Distance(component.EnemyNavAgent.GetPoint(), ((Component)val).transform.position) > 0.5 && Vector3.Distance(((Component)val).transform.position, (Vector3)val.Get<PlayerAvatar>("LastNavmeshPosition")) < 2f)
			{
				component.SetPlayerDamage(20);
				component.UpdateState((State)12);
				return false;
			}
			if (num <= 0f)
			{
				component.UpdateState((State)1);
			}
			return false;
		}
	}
	public class ReaperOverhaulState : MonoBehaviour
	{
		public Action<State> UpdateState;

		public Func<bool> VisionBlocked;

		public EnemyRunner Reaper;

		public EnemyRunnerAnim EnemyAnim;

		public Enemy Enemy;

		public Transform FeetTransform;

		public PhotonView PhotonView;

		public EnemyHealth EnemyHealth;

		public EnemyVision EnemyVision;

		public EnemyJump EnemyJump;

		public EnemyNavMeshAgent EnemyNavAgent;

		public EnemyRigidbody EnemyRigidbody;

		public float RetargetTimer = 0f;

		public float ChaseTime = 0f;

		public float HurtAggroCooldown = 0f;

		public float Aggro = 0f;

		public float RunningTimer = 0f;

		public int PrevHealth = 0;

		public int PlayerDamage = 0;

		public void Awake()
		{
			PhotonView = ((Component)this).GetComponent<PhotonView>();
		}

		public void Start()
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Expected O, but got Unknown
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Expected O, but got Unknown
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Expected O, but got Unknown
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Expected O, but got Unknown
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Expected O, but got Unknown
			FeetTransform = Reaper.feetTransform;
			EnemyAnim = Reaper.animator;
			EnemyVision = (EnemyVision)Enemy.Get<Enemy>("Vision");
			EnemyJump = (EnemyJump)Enemy.Get<Enemy>("Jump");
			EnemyNavAgent = (EnemyNavMeshAgent)Enemy.Get<Enemy>("NavMeshAgent");
			EnemyRigidbody = (EnemyRigidbody)Enemy.Get<Enemy>("Rigidbody");
			EnemyHealth = (EnemyHealth)Enemy.Get<Enemy>("Health");
			Reaper.hurtCollider.physHitForce = 3f;
			Reaper.hurtCollider.physHitTorque = 10f;
			Reaper.hurtCollider.playerTumbleForce = 2f;
		}

		public void Update()
		{
			PrevHealth = (int)EnemyHealth.Get<EnemyHealth>("healthCurrent");
			HurtAggroCooldown -= Time.deltaTime;
			RunningTimer -= Time.deltaTime;
			Reaper.hurtCollider.playerDamage = PlayerDamage;
		}

		public void OverrideMovement(float speed, float acceleration, float rigidbodyAcceleration, float time)
		{
			EnemyNavAgent.OverrideAgent(speed, acceleration, time);
			EnemyRigidbody.OverrideFollowPosition(time, rigidbodyAcceleration, -1f);
		}

		[PunRPC]
		public void SetPlayerDamage(int damage)
		{
			if (SemiFunc.IsMasterClient())
			{
				PhotonView.RPC("SetPlayerDamage", (RpcTarget)1, new object[1] { damage });
			}
			PlayerDamage = damage;
		}
	}
	public static class RobeOverhaul
	{
		public static ConfigEntry<bool> OverhaulAI;

		public static void Init()
		{
			OverhaulAI = Plugin.BindConfig("Robe", "OverhaulAI", defaultValue: true, "If true, Robe AI is overhauled", delegate
			{
				//IL_0030: Unknown result type (might be due to invalid IL or missing references)
				//IL_003b: Expected O, but got Unknown
				Plugin.SetPatch(OverhaulAI.Value, AccessTools.Method(typeof(EnemyRobe), "Awake", (Type[])null, (Type[])null), new HarmonyMethod(typeof(RobeOverhaul), "AwakePrefix", (Type[])null));
			});
		}

		public static bool AwakePrefix(EnemyRobe __instance)
		{
			RobeOverride robeOverride = ((Component)__instance).gameObject.AddComponent<RobeOverride>();
			robeOverride.RotationSpring = __instance.rotationSpring;
			robeOverride.Animator = ((Component)__instance.robeAnim).GetComponent<Animator>();
			robeOverride.deathParticles = __instance.robeAnim.deathParticles;
			robeOverride.spawnParticles = __instance.robeAnim.spawnParticles;
			robeOverride.sfxTargetPlayerLoop = __instance.robeAnim.sfxTargetPlayerLoop;
			robeOverride.sfxIdleBreak = __instance.robeAnim.sfxIdleBreak;
			robeOverride.sfxAttack = __instance.robeAnim.sfxAttack;
			robeOverride.sfxAttackGlobal = __instance.robeAnim.sfxAttackGlobal;
			robeOverride.sfxHurt = __instance.robeAnim.sfxHurt;
			robeOverride.sfxHandIdle = __instance.robeAnim.sfxHandIdle;
			robeOverride.sfxHandAggressive = __instance.robeAnim.sfxHandAggressive;
			robeOverride.sfxStunStart = __instance.robeAnim.sfxStunStart;
			robeOverride.sfxStunLoop = __instance.robeAnim.sfxStunLoop;
			robeOverride.sfxAttackUnder = __instance.robeAnim.sfxAttackUnder;
			robeOverride.sfxAttackUnderGlobal = __instance.robeAnim.sfxAttackUnderGlobal;
			Object.Destroy((Object)(object)__instance.robeAnim);
			Object.Destroy((Object)(object)__instance);
			return false;
		}
	}
	public class RobeOverride : MonoBehaviour
	{
		public enum RobeState
		{
			Spawn,
			Idle,
			Investigate,
			Shifty,
			Roam,
			FollowPlayer,
			HelpPlayer,
			ChaseBegin,
			Chase,
			Attack,
			AttackUnderBegin,
			AttackUnder,
			GiveSpace
		}

		public enum RobeAggroMode
		{
			None,
			All
		}

		public enum RobeFocusMode
		{
			None,
			Player
		}

		public record struct TrackedValuable(ValuableObject Valuable, UnityAction BreakListener);

		public StateMachine<RobeState> State;

		public float LastFocusedPlayerVisionTimer = float.PositiveInfinity;

		public float ItemBreakLogicTimer = 0f;

		public RobeAggroMode AggroMode = RobeAggroMode.All;

		public RobeFocusMode FocusMode = RobeFocusMode.Player;

		public Enemy Enemy;

		public EnemyParent EnemyParent;

		public PhotonView PhotonView;

		public EnemyVision Vision;

		public EnemyRigidbody Rigidbody;

		public Animator Animator;

		public HurtCollider HurtCollider;

		public EnemyNavMeshAgent EnemyAgent;

		public PlayerAvatar FocusedPlayer;

		public AggroHandler Aggro = new AggroHandler();

		public SpringQuaternion RotationSpring;

		private EnemyStateInvestigate StateInvestigate;

		public ValuableObject TargetValuable;

		public List<TrackedValuable> TrackedValuables = new List<TrackedValuable>();

		public Quaternion RotationTarget;

		public ParticleSystem[] deathParticles;

		public ParticleSystem spawnParticles;

		public Sound sfxTargetPlayerLoop;

		public Sound sfxIdleBreak;

		public Sound sfxAttack;

		public Sound sfxAttackGlobal;

		public Sound sfxHurt;

		public Sound sfxHandIdle;

		public Sound sfxHandAggressive;

		public Sound sfxStunStart;

		public Sound sfxStunLoop;

		public Sound sfxAttackUnder;

		public Sound sfxAttackUnderGlobal;

		[PunRPC]
		public void SetState(RobeState state, float stateTimer)
		{
			if (State.SetState(state, stateTimer) && SemiFunc.IsMasterClient() && SemiFunc.IsMultiplayer())
			{
				PhotonView.RPC("SetState", (RpcTarget)1, new object[2] { state, stateTimer });
			}
		}

		public void SyncFields()
		{
			if (GameManager.Multiplayer())
			{
				PhotonView.RPC("SyncFieldsRPC", (RpcTarget)1, new object[2]
				{
					Object.op_Implicit((Object)(object)FocusedPlayer) ? FocusedPlayer.photonView.ViewID : (-1),
					Object.op_Implicit((Object)(object)TargetValuable) ? ((Component)TargetValuable).GetComponent<PhotonView>().ViewID : (-1)
				});
			}
		}

		[PunRPC]
		private void SyncFieldsRPC(int focusedPlayerID, int targetValuableID)
		{
			FocusedPlayer = ((focusedPlayerID == -1) ? null : ((Component)PhotonView.Find(focusedPlayerID)).GetComponent<PlayerAvatar>());
			TargetValuable = ((targetValuableID == -1) ? null : ((Component)PhotonView.Find(targetValuableID)).GetComponent<ValuableObject>());
		}

		public void Awake()
		{
			Enemy = ((Component)this).GetComponent<Enemy>();
			PhotonView = ((Component)this).GetComponent<PhotonView>();
			State = new StateMachine<RobeState>(StateMachine);
			State.State = RobeState.Spawn;
		}

		public void Start()
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Expected O, but got Unknown
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Expected O, but got Unknown
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Expected O, but got Unknown
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Expected O, but got Unknown
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Expected O, but got Unknown
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: Expected O, but got Unknown
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Expected O, but got Unknown
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Expected O, but got Unknown
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Expected O, but got Unknown
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0195: Expected O, but got Unknown
			//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b2: Expected O, but got Unknown
			//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Expected O, but got Unknown
			//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e2: Expected O, but got Unknown
			//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fa: Expected O, but got Unknown
			//IL_0208: Unknown result type (might be due to invalid IL or missing references)
			//IL_0212: Expected O, but got Unknown
			//IL_0225: Unknown result type (might be due to invalid IL or missing references)
			//IL_022f: Expected O, but got Unknown
			HurtCollider = Utils.GetHurtColliders(((Component)this).transform.parent)[0];
			Rigidbody = (EnemyRigidbody)Enemy.Get<Enemy>("Rigidbody");
			EnemyAgent = (EnemyNavMeshAgent)Enemy.Get<Enemy>("NavMeshAgent");
			Vision = (EnemyVision)Enemy.Get<Enemy>("Vision");
			EnemyParent = (EnemyParent)Enemy.Get<Enemy>("EnemyParent");
			((Behaviour)((Component)EnemyParent).GetComponentInChildren<EnemyRobePersistent>()).enabled = false;
			if (!SemiFunc.IsMasterClientOrSingleplayer())
			{
				return;
			}
			EnemyHealth health = ((Component)this).GetComponent<EnemyHealth>();
			EnemyStateSpawn component = ((Component)this).GetComponent<EnemyStateSpawn>();
			EnemyStateDespawn component2 = ((Component)this).GetComponent<EnemyStateDespawn>();
			EnemyStateStunned component3 = ((Component)this).GetComponent<EnemyStateStunned>();
			StateInvestigate = ((Component)this).GetComponent<EnemyStateInvestigate>();
			Vision.onVisionTriggered.AddListener((UnityAction)delegate
			{
				//IL_0029: Unknown result type (might be due to invalid IL or missing references)
				//IL_002f: Expected O, but got Unknown
				//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d0: Expected O, but got Unknown
				//IL_010f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0115: Invalid comparison between Unknown and I4
				//IL_011e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0124: Invalid comparison between Unknown and I4
				//IL_012d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0134: Invalid comparison between Unknown and I4
				//IL_013d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0144: Invalid comparison between Unknown and I4
				if (FocusMode == RobeFocusMode.Player)
				{
					PlayerAvatar val = (PlayerAvatar)Vision.Get<EnemyVision>("onVisionTriggeredPlayer");
					if ((Object)(object)FocusedPlayer == (Object)null)
					{
						FocusedPlayer = val;
						LastFocusedPlayerVisionTimer = 0f;
					}
					else if ((Object)(object)FocusedPlayer == (Object)(object)val)
					{
						LastFocusedPlayerVisionTimer = 0f;
					}
				}
				else
				{
					LastFocusedPlayerVisionTimer = float.PositiveInfinity;
				}
				if (AggroMode == RobeAggroMode.All)
				{
					PlayerAvatar val2 = (PlayerAvatar)Vision.Get<EnemyVision>("onVisionTriggeredPlayer");
					if (val2.physGrabber.grabbed)
					{
						ItemAttributes component4 = ((Component)val2.physGrabber.Get<PhysGrabObject, PhysGrabber>("grabbedPhysGrabObject")).GetComponent<ItemAttributes>();
						if (component4 != null && ((int)component4.item.itemType == 6 || (int)component4.item.itemType == 7 || (int)component4.item.itemType == 9 || (int)component4.item.itemType == 11))
						{
							Aggro.GetAggro(val2).Aggro += (float)Vision.Get<EnemyVision>("VisionCheckTime") * 6f;
						}
					}
				}
			});
			Rigidbody.onGrabbed.AddListener((UnityAction)delegate
			{
				//IL_0038: Unknown result type (might be due to invalid IL or missing references)
				//IL_0042: Expected O, but got Unknown
				if (AggroMode == RobeAggroMode.All)
				{
					Aggro.GetAggro((PlayerAvatar)Rigidbody.Get<EnemyRigidbody>("onGrabbedPlayerAvatar")).Aggro += Time.deltaTime * 5f;
				}
			});
			Rigidbody.onTouchPlayer.AddListener((UnityAction)delegate
			{
				//IL_0038: Unknown result type (might be due to invalid IL or missing references)
				//IL_0042: Expected O, but got Unknown
				if (AggroMode == RobeAggroMode.All)
				{
					Aggro.GetAggro((PlayerAvatar)Rigidbody.Get<EnemyRigidbody>("onTouchPlayerAvatar")).Aggro += Time.deltaTime * 5f;
				}
			});
			Rigidbody.onTouchPlayerGrabbedObject.AddListener((UnityAction)delegate
			{
				//IL_0038: Unknown result type (might be due to invalid IL or missing references)
				//IL_0042: Expected O, but got Unknown
				if (AggroMode == RobeAggroMode.All)
				{
					Aggro.GetAggro((PlayerAvatar)Rigidbody.Get<EnemyRigidbody>("onTouchPlayerGrabbedObjectAvatar")).Aggro += Time.deltaTime * 5f;
				}
			});
			health.onHurt.AddListener((UnityAction)delegate
			{
				//IL_0017: Unknown result type (might be due to invalid IL or missing references)
				sfxHurt.Play(((Component)this).transform.position, 1f, 1f, 1f, 1f);
				if (AggroMode == RobeAggroMode.All)
				{
					for (int j = 0; j < Aggro.AggroList.Count; j++)
					{
						Aggro.AggroList[j].Aggro += 15f;
					}
				}
			});
			health.onObjectHurt.AddListener((UnityAction)delegate
			{
				//IL_0033: Unknown result type (might be due to invalid IL or missing references)
				//IL_003d: Expected O, but got Unknown
				if (AggroMode == RobeAggroMode.All)
				{
					Aggro.GetAggro((PlayerAvatar)health.Get<EnemyHealth>("onObjectHurtPlayer")).Aggro += 15f;
				}
			});
			health.onDeath.AddListener((UnityAction)delegate
			{
				Animator.SetTrigger("Death");
				ParticleSystem[] array = deathParticles;
				for (int i = 0; i < array.Length; i++)
				{
					array[i].Play();
				}
				if (Utils.IsHost())
				{
					EnemyParent.Despawn();
				}
			});
			component.OnSpawn.AddListener((UnityAction)delegate
			{
				Aggro.LoseAggro(float.PositiveInfinity);
				if (SemiFunc.IsMasterClientOrSingleplayer())
				{
					SetState(RobeState.Spawn, 0.5f);
				}
			});
			component2.OnDespawn.AddListener((UnityAction)delegate
			{
				Animator.SetTrigger("despawn");
			});
			component3.onStunnedStart.AddListener((UnityAction)delegate
			{
				Animator.SetTrigger("Stun");
				Animator.SetBool("Stunned", true);
				sfxStunLoop.PlayLoop(true, 2f, 2f, 1f);
			});
			component3.onStunnedEnd.AddListener((UnityAction)delegate
			{
				Animator.SetBool("Stunned", false);
				sfxStunLoop.PlayLoop(false, 2f, 2f, 1f);
			});
			StateInvestigate.onInvestigateTriggered.AddListener((UnityAction)delegate
			{
				RobeState state = State.State;
				RobeState robeState = state;
				if ((uint)robeState <= 1u || robeState == RobeState.Roam)
				{
					SetState(RobeState.Investigate, Random.Range(4f, 6f));
				}
			});
		}

		public void Update()
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Invalid comparison between Unknown and I4
			//IL_0088: 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)
			EnemyParent.SpawnedTimerPause(float.PositiveInfinity);
			if ((int)Enemy.CurrentState != 9)
			{
				LastFocusedPlayerVisionTimer += Time.deltaTime;
				if (SemiFunc.IsMasterClientOrSingleplayer())
				{
					ItemBreakTrackingLogic();
					ExtractionAggroLogic();
				}
				AggroLogic();
				State.Update(Time.deltaTime);
				Aggro.LoseAggro(Time.deltaTime);
				((Component)this).transform.rotation = SemiFunc.SpringQuaternionGet(RotationSpring, RotationTarget, -1f);
			}
		}

		public void StateMachine()
		{
			//IL_02af: Unknown result type (might be due to invalid IL or missing references)
			//IL_034e: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ea7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ed2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0fdd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0fe2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0fec: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ff1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_036f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0374: Unknown result type (might be due to invalid IL or missing references)
			//IL_0379: Unknown result type (might be due to invalid IL or missing references)
			//IL_04db: Unknown result type (might be due to invalid IL or missing references)
			//IL_04e0: 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_05ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_05d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_05e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_05ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_05ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_05f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_05fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0602: Unknown result type (might be due to invalid IL or missing references)
			//IL_0607: Unknown result type (might be due to invalid IL or missing references)
			//IL_0611: Unknown result type (might be due to invalid IL or missing references)
			//IL_0616: Unknown result type (might be due to invalid IL or missing references)
			//IL_0d71: Unknown result type (might be due to invalid IL or missing references)
			//IL_0e31: Unknown result type (might be due to invalid IL or missing references)
			//IL_1013: Unknown result type (might be due to invalid IL or missing references)
			//IL_03f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0406: Unknown result type (might be due to invalid IL or missing references)
			//IL_069e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0862: Unknown result type (might be due to invalid IL or missing references)
			//IL_087d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0884: Expected O, but got Unknown
			//IL_088a: Unknown result type (might be due to invalid IL or missing references)
			//IL_089a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a76: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f51: Unknown result type (might be due to invalid IL or missing references)
			//IL_039e: Unknown result type (might be due to invalid IL or missing references)
			//IL_050a: Unknown result type (might be due to invalid IL or missing references)
			//IL_06c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_06d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_063b: Unknown result type (might be due to invalid IL or missing references)
			//IL_08e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c07: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c17: Unknown result type (might be due to invalid IL or missing references)
			//IL_0bbf: Unknown result type (might be due to invalid IL or missing references)
			//IL_0184: Unknown result type (might be due to invalid IL or missing references)
			//IL_0194: Unknown result type (might be due to invalid IL or missing references)
			//IL_0be4: Unknown result type (might be due to invalid IL or missing references)
			//IL_093d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0948: Unknown result type (might be due to invalid IL or missing references)
			//IL_0958: Unknown result type (might be due to invalid IL or missing references)
			//IL_095d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0962: Unknown result type (might be due to invalid IL or missing references)
			//IL_0966: Unknown result type (might be due to invalid IL or missing references)
			//IL_0970: Unknown result type (might be due to invalid IL or missing references)
			//IL_0975: Unknown result type (might be due to invalid IL or missing references)
			//IL_0992: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val;
			float num5;
			switch (State.State)
			{
			case RobeState.Spawn:
				if (State.ConsumeStateImpulse())
				{
					SemiFunc.EnemySpawn(Enemy);
					AggroMode = RobeAggroMode.All;
					Animator.Play("Robe Spawn", 0, 0f);
					spawnParticles.Play();
				}
				if (!SemiFunc.IsMasterClientOrSingleplayer())
				{
				}
				if (State.StateTimer <= 0f)
				{
					SetState(RobeState.Idle, 1f);
				}
				break;
			case RobeState.Idle:
				if (State.ConsumeStateImpulse())
				{
					AggroMode = RobeAggroMode.All;
					EnemyAgent.ResetPath();
				}
				if ((Object)(object)FocusedPlayer != (Object)null)
				{
					LookAt(((Component)FocusedPlayer).transform.position);
				}
				if (!SemiFunc.IsMasterClientOrSingleplayer() || LosePlayerLogic() || !(State.StateTimer <= 0f))
				{
					break;
				}
				if ((Object)(object)FocusedPlayer != (Object)null)
				{
					float num4 = Utils.WeightedDistance(((Component)this).transform.position, ((Component)FocusedPlayer).transform.position, 1f, 0.2f);
					if (FocusedPlayer.physGrabber.grabbed)
					{
						object obj = FocusedPlayer.physGrabber.Get<PhysGrabber>("grabbedPhysGrabObject");
						PhysGrabObject val4 = (PhysGrabObject)((obj is PhysGrabObject) ? obj : null);
						if (val4 != null && (Object)(object)(TargetValuable = ((Component)val4).GetComponent<ValuableObject>()) != (Object)null)
						{
							SetState(RobeState.HelpPlayer, Random.Range(40f, 70f));
							SyncFields();
							break;
						}
					}
					if (num4 > 5f || num4 < 2.5f)
					{
						SetState(RobeState.FollowPlayer, Random.Range(10f, 12f));
					}
					else
					{
						SetState(RobeState.Shifty, 3f);
					}
				}
				else
				{
					SetState(RobeState.Roam, Random.Range(4f, 9f));
				}
				break;
			case RobeState.Investigate:
				if (State.ConsumeStateImpulse())
				{
					AggroMode = RobeAggroMode.All;
					if (Utils.FindNavPosition((Vector3)StateInvestigate.Get<EnemyStateInvestigate>("onInvestigateTriggeredPosition"), out var navPosition5))
					{
						EnemyAgent.SetDestination(navPosition5);
					}
					else
					{
						State.StateStartImpulse = true;
					}
				}
				NormalRotationLogic();
				if (Utils.IsHost() && State.StateTimer <= 0f)
				{
					SetState(RobeState.Idle, 1f);
				}
				break;
			case RobeState.Shifty:
			{
				if (State.ConsumeStateImpulse())
				{
					AggroMode = RobeAggroMode.All;
					LevelPoint val2 = SemiFunc.LevelPointGet(((Component)this).transform.position, 1f, 4f);
					if (val2 != null && Utils.FindNavPosition(((Component)val2).transform.position + Random.insideUnitSphere, out var navPosition3))
					{
						EnemyAgent.SetDestination(navPosition3);
					}
					OverrideMovement(0.75f, 1f, 1f);
				}
				if (State.StateEndImpulse)
				{
					EndMovementOverride();
				}
				NormalRotationLogic();
				float num = (Object.op_Implicit((Object)(object)FocusedPlayer) ? Utils.WeightedDistance(((Component)this).transform.position, ((Component)FocusedPlayer).transform.position, 1f, 0.2f) : 3f);
				if (SemiFunc.IsMasterClientOrSingleplayer())
				{
					if (LosePlayerLogic())
					{
						SetState(RobeState.Idle, Random.Range(0.25f, 0.5f));
					}
					else if (num < 2f || num > 5f || State.StateTimer <= 0f)
					{
						SetState(RobeState.Idle, 1f);
					}
				}
				break;
			}
			case RobeState.Roam:
				if (State.ConsumeStateImpulse())
				{
					AggroMode = RobeAggroMode.All;
					LevelPoint val5 = SemiFunc.LevelPointGet(((Component)this).transform.position, 3f, 10f);
					if (val5 != null && Utils.FindNavPosition(((Component)val5).transform.position + Random.insideUnitSphere, out var navPosition7))
					{
						EnemyAgent.SetDestination(navPosition7);
					}
				}
				NormalRotationLogic();
				if (SemiFunc.IsMasterClientOrSingleplayer())
				{
					if ((Object)(object)FocusedPlayer != (Object)null)
					{
						SetState(RobeState.FollowPlayer, 3f);
					}
					else if (!EnemyAgent.HasPath() || State.StateTimer <= 0f)
					{
						SetState(RobeState.Idle, Random.Range(1f, 2f));
					}
				}
				break;
			case RobeState.FollowPlayer:
				if (State.ConsumeStateImpulse())
				{
					AggroMode = RobeAggroMode.All;
					if ((Object)(object)FocusedPlayer != (Object)null)
					{
						Vector3 position = ((Component)FocusedPlayer).transform.position;
						val = ((Component)this).transform.position - ((Component)FocusedPlayer).transform.position;
						if (Utils.FindNavPosition(position + ((Vector3)(ref val)).normalized * 3f + Random.insideUnitSphere * 0.5f, out var navPosition2))
						{
							EnemyAgent.SetDestination(navPosition2);
							goto IL_0651;
						}
					}
					State.StateStartImpulse = true;
					goto IL_0651;
				}
				goto IL_0668;
			case RobeState.HelpPlayer:
				if (State.ConsumeStateImpulse())
				{
					AggroMode = RobeAggroMode.All;
					sfxHandIdle.PlayLoop(true, 2f, 2f, 0.4f);
					OverrideMovement(1f, 2f, 3f);
					EnemyAgent.ResetPath();
					State.SetStateTimer(0, 0f);
				}
				if (State.StateEndImpulse)
				{
					sfxHandIdle.PlayLoop(false, 2f, 2f, 0.4f);
					EndMovementOverride();
				}
				if ((Object)(object)TargetValuable != (Object)null)
				{
					LookAt(((Component)TargetValuable).transform.position);
					Rigidbody val3 = (Rigidbody)TargetValuable.Get<ValuableObject>("rb");
					float num3 = Utils.WeightedDistance(((Component)this).transform.position, ((Component)FocusedPlayer).transform.position, 1f, 0.2f);
					if (num3 < 4.5f)
					{
						val3.AddForce(new Vector3(0f, Mathf.Min(val3.mass, 5f), 0f), (ForceMode)0);
					}
					if ((num3 < 1.8f || num3 > 2.6f) && State.GetStateTimer(0) <= 0f)
					{
						State.SetStateTimer(0, 0.1f);
						Vector3 position2 = ((Component)TargetValuable).transform.position;
						val = ((Component)this).transform.position - ((Component)TargetValuable).transform.position;
						Utils.FindNavPosition(position2 + ((Vector3)(ref val)).normalized * 1.5f, out var navPosition6, 3f);
						EnemyAgent.SetDestination(navPosition6);
					}
				}
				if (SemiFunc.IsMasterClientOrSingleplayer() && (State.StateTimer <= 0f || ((Object)(object)FocusedPlayer != (Object)null && !FocusedPlayer.physGrabber.grabbed)))
				{
					SetState(RobeState.Idle, 1f);
				}
				break;
			case RobeState.ChaseBegin:
				if (State.ConsumeStateImpulse())
				{
					AggroMode = RobeAggroMode.None;
					((Behaviour)HurtCollider).enabled = false;
					EnemyAgent.ResetPath();
					AttackAnimation();
				}
				if (State.StateEndImpulse)
				{
					((Behaviour)HurtCollider).enabled = true;
				}
				if ((Object)(object)FocusedPlayer != (Object)null)
				{
					LookAt(((Component)FocusedPlayer).transform.position);
				}
				if (SemiFunc.IsMasterClientOrSingleplayer() && State.StateTimer <= 0f)
				{
					SetState(RobeState.Chase, Random.Range(10f, 14f));
				}
				break;
			case RobeState.Chase:
			{
				if (State.ConsumeStateImpulse())
				{
					AggroMode = RobeAggroMode.None;
					sfxTargetPlayerLoop.PlayLoop(true, 2f, 2f, 2f);
					OverrideMovement(6f, 10f, 20f);
					State.SetStateTimer(0, 0f);
				}
				if (State.StateEndImpulse)
				{
					EndMovementOverride();
					sfxTargetPlayerLoop.PlayLoop(false, 2f, 2f, 2f);
					Aggro.LoseAggro(float.PositiveInfinity);
				}
				NormalRotationLogic();
				if (State.GetStateTimer(0) <= 0f)
				{
					State.SetStateTimer(0, 0.1f);
					if ((Object)(object)FocusedPlayer != (Object)null && Utils.FindNavPosition(((Component)FocusedPlayer).transform.position, out var navPosition4))
					{
						EnemyAgent.SetDestination(navPosition4);
					}
				}
				float num2 = (Object.op_Implicit((Object)(object)FocusedPlayer) ? Utils.WeightedDistance(((Component)this).transform.position, ((Component)FocusedPlayer).transform.position, 1f, 0.2f) : 10f);
				bool flag = Object.op_Implicit((Object)(object)FocusedPlayer) && (bool)FocusedPlayer.Get<PlayerAvatar>("isCrawling");
				if (SemiFunc.IsMasterClientOrSingleplayer())
				{
					if (LastFocusedPlayerVisionTimer > 8f)
					{
						FocusedPlayer = null;
						SyncFields();
						SetState(RobeState.GiveSpace, 2f);
					}
					else if (num2 < 1.5f && !flag)
					{
						SetState(RobeState.Attack, 1f);
					}
					else if (num2 < 2f && flag)
					{
						SetState(RobeState.AttackUnderBegin, 0.5f);
					}
					else if (State.StateTimer <= 0f)
					{
						SetState(RobeState.GiveSpace, 2f);
					}
				}
				break;
			}
			case RobeState.Attack:
				if (State.ConsumeStateImpulse())
				{
					AggroMode = RobeAggroMode.None;
					AttackAnimation();
					EnemyAgent.ResetPath();
				}
				HurtCollider.playerDamage = 120;
				if ((Object)(object)FocusedPlayer != (Object)null)
				{
					LookAt(((Component)FocusedPlayer).transform.position);
				}
				if (SemiFunc.IsMasterClientOrSingleplayer() && State.StateTimer <= 0f)
				{
					SetState(RobeState.GiveSpace, 2f);
				}
				break;
			case RobeState.AttackUnderBegin:
				if (State.ConsumeStateImpulse())
				{
					AggroMode = RobeAggroMode.None;
					EnemyAgent.ResetPath();
					Animator.SetTrigger("LookUnder");
					Animator.SetBool("LookingUnder", true);
				}
				HurtCollider.playerDamage = 80;
				if ((Object)(object)FocusedPlayer != (Object)null)
				{
					LookAt(((Component)FocusedPlayer).transform.position);
				}
				if (!SemiFunc.IsMasterClientOrSingleplayer())
				{
				}
				if (State.StateTimer <= 0f)
				{
					SetState(RobeState.AttackUnder, 0.5f);
				}
				break;
			case RobeState.AttackUnder:
				if (State.ConsumeStateImpulse())
				{
					AggroMode = RobeAggroMode.None;
					AttackShake();
					sfxAttackUnder.Play(((Component)this).transform.position, 1f, 1f, 1f, 1f);
					sfxAttackUnderGlobal.Play(((Component)this).transform.position, 1f, 1f, 1f, 1f);
					Animator.SetTrigger("LookUnderAttack");
				}
				if (State.StateEndImpulse)
				{
					Animator.SetBool("LookingUnder", false);
				}
				HurtCollider.playerDamage = 80;
				if ((Object)(object)FocusedPlayer != (Object)null)
				{
					LookAt(((Component)FocusedPlayer).transform.position);
				}
				if (SemiFunc.IsMasterClientOrSingleplayer() && State.StateTimer <= 0f)
				{
					SetState(RobeState.GiveSpace, 2f);
				}
				break;
			case RobeState.GiveSpace:
				{
					if (State.ConsumeStateImpulse())
					{
						AggroMode = RobeAggroMode.All;
						sfxTargetPlayerLoop.PlayLoop(true, 2f, 2f, 2f);
						if (Utils.FindNavPosition(((Component)EnemyAgent).transform.position + Random.onUnitSphere * 4f, out var navPosition))
						{
							EnemyAgent.SetDestination(navPosition);
						}
						else
						{
							State.StateStartImpulse = true;
						}
					}
					if (State.StateEndImpulse)
					{
						sfxTargetPlayerLoop.PlayLoop(false, 2f, 2f, 2f);
					}
					NormalRotationLogic();
					if (SemiFunc.IsMasterClientOrSingleplayer() && State.StateTimer <= 0f)
					{
						SetState(RobeState.Idle, 2f);
					}
					break;
				}
				IL_0651:
				OverrideMovement(2f, 6f, 20f);
				goto IL_0668;
				IL_0668:
				if (State.StateEndImpulse)
				{
					EndMovementOverride();
				}
				if ((Object)(object)FocusedPlayer != (Object)null)
				{
					LookAt(((Component)FocusedPlayer).transform.position);
				}
				num5 = (Object.op_Implicit((Object)(object)FocusedPlayer) ? Utils.WeightedDistance(((Component)this).transform.position, ((Component)FocusedPlayer).transform.position, 1f, 0.2f) : 3f);
				if (SemiFunc.IsMasterClientOrSingleplayer())
				{
					if (LosePlayerLogic())
					{
						SetState(RobeState.Idle, Random.Range(0.25f, 0.5f));
					}
					else if (num5 > 10f)
					{
						SetState(RobeState.ChaseBegin, Random.Range(0.25f, 0.5f));
					}
					else if ((num5 < 3.5f && num5 > 2.5f) || !EnemyAgent.HasPath() || State.StateTimer <= 0f)
					{
						SetState(RobeState.Idle, 0f);
					}
				}
				break;
			}
		}

		public void ItemBreakTrackingLogic()
		{
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: Expected O, but got Unknown
			//IL_01de: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e8: Expected O, but got Unknown
			//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0205: Expected O, but got Unknown
			//IL_020d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0214: Expected O, but got Unknown
			ItemBreakLogicTimer += Time.deltaTime;
			if (ItemBreakLogicTimer < 1f)
			{
				return;
			}
			ItemBreakLogicTimer = 0f;
			for (int i = 0; i < TrackedValuables.Count; i++)
			{
				_ = TrackedValuables[i];
				if (false)
				{
					TrackedValuables.RemoveAt(i);
				}
			}
			for (int j = 0; j < ValuableDirector.instance.valuableList.Count; j++)
			{
				ValuableObject valuable = ValuableDirector.instance.valuableList[j];
				if ((Object)(object)valuable == (Object)null)
				{
					continue;
				}
				float num = Vector3.Distance(((Component)valuable).transform.position, ((Component)this).transform.position);
				int num2 = -1;
				for (int k = 0; k < TrackedValuables.Count; k++)
				{
					if ((Object)(object)TrackedValuables[k].Valuable == (Object)(object)valuable)
					{
						num2 = k;
					}
				}
				if (num > 6f && num2 != -1)
				{
					PhysGrabObjectImpactDetector val = (PhysGrabObjectImpactDetector)valuable.Get<PhysGrabObject, ValuableObject>("physGrabObject").Get<PhysGrabObject>("impactDetector");
					val.onAllBreaks.RemoveListener(TrackedValuables[num2].BreakListener);
					TrackedValuables.RemoveAt(num2);
				}
				else
				{
					if (!(num <= 4f) || num2 != -1)
					{
						continue;
					}
					PhysGrabObject physGrabObject = (PhysGrabObject)valuable.Get<ValuableObject>("physGrabObject");
					PhysGrabObjectImpactDetector impactDetector = (PhysGrabObjectImpactDetector)physGrabObject.Get<PhysGrabObject>("impactDetector");
					UnityAction val2 = (UnityAction)delegate
					{
						//IL_0083: Unknown result type (might be due to invalid IL or missing references)
						//IL_008d: Expected O, but got Unknown
						if (AggroMode == RobeAggroMode.All && !(bool)impactDetector.Get<PhysGrabObjectImpactDetector>("isIndestructible") && !impactDetector.destroyDisable && !((float)physGrabObject.Get<PhysGrabObject>("grabbedTimer") <= 0f))
						{
							PlayerAggro aggro = Aggro.GetAggro((PlayerAvatar)physGrabObject.Get<PhysGrabObject>("lastPlayerGrabbing"));
							aggro.Aggro += (physGrabObject.dead ? (valuable.dollarValueOriginal / 100f) : ((valuable.dollarValueOriginal - valuable.dollarValueCurrent) / 100f));
						}
					};
					TrackedValuables.Add(new TrackedValuable(valuable, val2));
					impactDetector.onAllBreaks.AddListener(val2);
				}
			}
		}

		public void AggroLogic()
		{
			if (AggroMode == RobeAggroMode.None)
			{
				return;
			}
			PlayerAggro playerAggro = null;
			for (int i = 0; i < Aggro.AggroList.Count; i++)
			{
				PlayerAggro playerAggro2 = Aggro.AggroList[i];
				if (playerAggro == null || playerAggro2.Aggro > playerAggro.Aggro)
				{
					playerAggro = playerAggro2;
				}
			}
			if (playerAggro == null)
			{
				sfxTargetPlayerLoop.PlayLoop(false, 1f, 1f, 1f);
				return;
			}
			if (playerAggro.Aggro > 5f)
			{
				sfxTargetPlayerLoop.PlayLoop(true, 1f, 1f, 1f);
			}
			else
			{
				sfxTargetPlayerLoop.PlayLoop(false, 1f, 1f, 1f);
			}
			if (!(playerAggro.Aggro < 10f))
			{
				sfxTargetPlayerLoop.PlayLoop(false, 1f, 1f, 1f);
				if (Utils.IsHost() && State.State != RobeState.ChaseBegin)
				{
					LastFocusedPlayerVisionTimer = 0f;
					FocusedPlayer = playerAggro.Player;
					SyncFields();
					SetState(RobeState.ChaseBegin, 1f);
				}
			}
		}

		public void ExtractionAggroLogic()
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Invalid comparison between Unknown and I4
			//IL_003e: 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)
			if ((Object)(object)FocusedPlayer != (Object)null)
			{
				object obj = RoundDirector.instance.Get<RoundDirector>("extractionPointCurrent");
				ExtractionPoint val = (ExtractionPoint)((obj is ExtractionPoint) ? obj : null);
				if (val != null && (int)val.Get<State, ExtractionPoint>("currentState") == 4 && Vector3.Distance(((Component)val).transform.position, ((Component)this).transform.position) < 5f)
				{
					Aggro.GetAggro(FocusedPlayer).Aggro += Time.deltaTime * 10f;
				}
			}
		}

		public bool LosePlayerLogic()
		{
			if ((Object)(object)FocusedPlayer != (Object)null && LastFocusedPlayerVisionTimer > 10f)
			{
				FocusedPlayer = null;
				SyncFields();
				return true;
			}
			return false;
		}

		public void NormalRotationLogic()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = EnemyAgent.Get<Vector3, EnemyNavMeshAgent>("AgentVelocity");
			Vector3 normalized = ((Vector3)(ref val)).normalized;
			if (((Vector3)(ref normalized)).magnitude > 0.1f)
			{
				LookInDirection(normalized);
			}
		}

		public void LookAt(Vector3 point)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = point - ((Component)this).transform.position;
			LookInDirection(((Vector3)(ref val)).normalized);
		}

		public void LookInDirection(Vector3 point)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			RotationTarget = Quaternion.LookRotation(point);
			((Quaternion)(ref RotationTarget)).eulerAngles = new Vector3(0f, ((Quaternion)(ref RotationTarget)).eulerAngles.y, 0f);
		}

		public void AttackShake()
		{
			//IL_0020: 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)
			GameDirector.instance.CameraShake.ShakeDistance(5f, 3f, 8f, ((Component)this).transform.position, 0.5f);
			GameDirector.instance.CameraImpact.ShakeDistance(5f, 3f, 8f, ((Component)this).transform.position, 0.1f);
		}

		public void AttackSounds()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			sfxAttack.Play(((Component)this).transform.position, 1f, 1f, 1f, 1f);
			sfxAttackGlobal.Play(((Component)this).transform.position, 1f, 1f, 1f, 1f);
		}

		public void AttackAnimation()
		{
			AttackSounds();
			AttackShake();
			Animator.SetTrigger("attack");
		}

		public void OverrideMovement(float speed, float acceleration, float rigidbodyAcceleration)
		{
			EnemyAgent.OverrideAgent(speed, acceleration, float.PositiveInfinity);
			Rigidbody.OverrideFollowPosition(float.PositiveInfinity, rigidbodyAcceleration, -1f);
		}

		public void EndMovementOverride()
		{
			EnemyAgent.OverrideAgent(0f, 0f, 0.001f);
			Rigidbody.OverrideFollowPosition(0.001f, 0f, -1f);
		}
	}
	public class StateMachine<TState> where TState : Enum
	{
		public enum StateSetMode
		{
			None,
			SetThisUpdate,
			Set
		}

		public TState State;

		public TState FutureState;

		public float StateTimer;

		public bool StateStartImpulse = false;

		public bool StateEndImpulse = false;

		public StateSetMode SetMode = StateSetMode.None;

		public Action StateMachineAction;

		public List<object> StateData;

		public List<float> StateTimers;

		public StateMachine(Action stateMachineAction)
		{
			StateMachineAction = stateMachineAction;
			StateData = new List<object>();
			StateTimers = new List<float>();
			base..ctor();
		}

		public void Update(float deltaTime)
		{
			StateTimer -= deltaTime;
			for (int i = 0; i < StateTimers.Count; i++)
			{
				StateTimers[i] -= deltaTime;
			}
			if (SetMode == StateSetMode.Set)
			{
				StateEndImpulse = true;
			}
			StateMachineAction();
			if (SetMode == StateSetMode.Set)
			{
				State = FutureState;
				StateStartImpulse = true;
				SetMode = StateSetMode.None;
				StateData.Clear();
				StateTimers.Clear();
			}
			if (SetMode == StateSetMode.SetThisUpdate)
			{
				SetMode = StateSetMode.Set;
			}
			StateEndImpulse = false;
		}

		public bool SetState(TState state, float time)
		{
			if (SetMode != 0)
			{
				return false;
			}
			StateTimer = time;
			FutureState = state;
			SetMode = StateSetMode.SetThisUpdate;
			return true;
		}

		public bool ConsumeStateImpulse()
		{
			if (StateStartImpulse)
			{
				StateStartImpulse = false;
				return true;
			}
			return false;
		}

		public T GetStateData<T>(int index)
		{
			return (T)StateData[index];
		}

		public void SetStateData<T>(int index, T value)
		{
			while (StateData.Count <= index)
			{
				StateData.Add(null);
			}
			StateData[index] = value;
		}

		public float GetStateTimer(int index)
		{
			return StateTimers[index];
		}

		public void SetStateTimer(int index, float time)
		{
			while (StateTimers.Count <= index)
			{
				StateTimers.Add(0f);
			}
			StateTimers[index] = time;
		}
	}
	public static class TrudgeOverhaul
	{
		public static ConfigEntry<bool> OverhaulAI;

		public static void Init()
		{
			OverhaulAI = Plugin.BindConfig("Trudge", "OverhaulAI", defaultValue: true, "If true, Trudge AI is overhauled", delegate
			{
				//IL_0030: Unknown result type (might be due to invalid IL or missing references)
				//IL_003b: Expected O, but got Unknown
				Plugin.SetPatch(OverhaulAI.Value, AccessTools.Method(typeof(EnemySlowWalker), "Start", (Type[])null, (Type[])null), new HarmonyMethod(typeof(TrudgeOverhaul), "StartPrefix", (Type[])null));
			});
		}

		public static bool StartPrefix(EnemySlowWalker __instance)
		{
			TrudgeOverride trudgeOverride = ((Component)__instance).gameObject.AddComponent<TrudgeOverride>();
			EnemySlowWalkerAnim animator = __instance.animator;
			((Behaviour)animator).enabled = false;
			trudgeOverride.ParticleDeathImpact = __instance.particleDeathImpact;
			trudgeOverride.ParticleDeathBitsFar = __instance.particleDeathBitsFar;
			trudgeOverride.ParticleDeathBitsShort = __instance.particleDeathBitsShort;
			trudgeOverride.ParticleDeathSmoke = __instance.particleDeathSmoke;
			trudgeOverride.FeetTransform = __instance.feetTransform;
			trudgeOverride.LookAtTransform = __instance.lookAtTransform;
			trudgeOverride.EnemyAnimator = animator;
			trudgeOverride.RotationSpring = __instance.horizontalRotationSpring;
			Object.Destroy((Object)(object)__instance);
			return false;
		}
	}
	public class TrudgeOverride : MonoBehaviour
	{
		public enum TrudgeState
		{
			Invalid,
			Spawn,
			Idle,
			ApproachTarget,
			Notice,
			ChargeBegin,
			Charge,
			Attack,
			StuckAttack,
			DestroyTarget
		}

		public PhotonView PhotonView;

		public Enemy Enemy;

		public EnemyParent EnemyParent;

		public EnemyVision Vision;

		public EnemyNavMeshAgent EnemyNavAgent;

		public NavMeshAgent NavAgent;

		public EnemyRigidbody EnemyRigidbody;

		public Rigidbody Rigidbody;

		public EnemySlowWalkerAnim EnemyAnimator;

		public EnemyStateInvestigate StateInvestigate;

		public Animator Animator;

		public SpringQuaternion RotationSpring;

		public Transform LookAtTransform;

		public Transform FeetTransform;

		public MonoBehaviour Target;

		public StateMachine<TrudgeState> State;

		public float PrevAggro = 0f;

		public float Aggro = 0f;

		public Quaternion RotationTarget;

		public float DefaultRotationSpeed;

		public float TargetClosestApproach = float.PositiveInfinity;

		public bool HandleAggro = true;

		public int AnimMoving = Animator.StringToHash("moving");

		public int AnimStunned = Animator.StringToHash("stunned");

		public int AnimDespawning = Animator.StringToHash("despawning");

		public int AnimFalling = Animator.StringToHash("falling");

		public int AnimLookingUnder = Animator.StringToHash("lookingUnder");

		public int AnimStun = Animator.StringToHash("Stun");

		public int AnimNotice = Animator.StringToHash("Notice");

		public int AnimAttack = Animator.StringToHash("Attack");

		public int AnimJump = Animator.StringToHash("Jump");

		public int AnimLand = Animator.StringToHash("Land");

		public int AnimLookUnder = Animator.StringToHash("LookUnder");

		public int AnimLookUnderAttack = Animator.StringToHash("LookUnderAttack");

		public int AnimStuckAttack = Animator.StringToHash("StuckAttack");

		public ParticleSystem ParticleDeathImpact;

		public ParticleSystem ParticleDeathBitsFar;

		public ParticleSystem ParticleDeathBitsShort;

		public ParticleSystem ParticleDeathSmoke;

		public void Awake()
		{
			Enemy = ((Component)this).GetComponent<Enemy>();
			PhotonView = ((Component)this).GetComponent<PhotonView>();
			EnemyNavAgent = ((Component)this).GetComponent<EnemyNavMeshAgent>();
			NavAgent = ((Component)this).GetComponent<NavMeshAgent>();
			StateInvestigate = ((Component)this).GetComponent<EnemyStateInvestigate>();
			State = new StateMachine<TrudgeState>(StateMachine);
		}

		public void Start()
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Expected O, but got Unknown
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Expected O, but got Unknown
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Expected O, but got Unknown
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Expected O, but got Unknown
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Expected O, but got Unknown
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Expected O, but got Unknown
			//IL_00e1: 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_0156: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: Expected O, but got Unknown
			//IL_0173: Unknown result type (might be due to invalid IL or missing references)
			//IL_017d: Expected O, but got Unknown
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_019a: Expected O, but got Unknown
			//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b7: Expected O, but got Unknown
			//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cf: Expected O, but got Unknown
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e7: Expected O, but got Unknown
			//IL_01f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ff: Expected O, but got Unknown
			Vision = (EnemyVision)Enemy.Get<Enemy>("Vision");
			EnemyRigidbody = (EnemyRigidbody)Enemy.Get<Enemy>("Rigidbody");
			Animator = (Animator)EnemyAnimator.Get<EnemySlowWalkerAnim>("animator");
			EnemyParent = (EnemyParent)Enemy.Get<Enemy>("EnemyParent");
			Rigidbody = (Rigidbody)EnemyRigidbody.Get<EnemyRigidbody>("rb");
			EnemyStateSpawn component = ((Component)this).GetComponent<EnemyStateSpawn>();
			EnemyHealth val = (EnemyHealth)Enemy.Get<Enemy>("Health");
			((Behaviour)StateInvestigate).enabled = false;
			DefaultRotationSpeed = RotationSpring.speed;
			NavAgent.areaMask = -1;
			Transform vacuumSphere = EnemyAnimator.slowWalkerAttack.vacuumSphere;
			vacuumSphere.localScale *= 1.7f;
			List<HurtCollider> hurtColliders = Utils.GetHurtColliders(EnemyAnimator.slowWalkerAttack.attackImpactHurtColliders.transform);
			for (int i = 0; i < hurtColliders.Count; i++)
			{
				HurtCollider val2 = hurtColliders[i];
				val2.playerKill = false;
				val2.playerDamage = 30;
			}
			EnemyRigidbody.onGrabbed.AddListener((UnityAction)delegate
			{
				if (HandleAggro)
				{
					Aggro += Time.deltaTime * 5f;
				}
			});
			EnemyRigidbody.onTouchPlayer.AddListener((UnityAction)delegate
			{
				if (HandleAggro)
				{
					Aggro += Time.deltaTime * 5f;
				}
			});
			EnemyRigidbody.onTouchPlayerGrabbedObject.AddListener((UnityAction)delegate
			{
				if (HandleAggro)
				{
					Aggro += Time.deltaTime * 5f;
				}
			});
			StateInvestigate.onInvestigateTriggered.AddListener((UnityAction)delegate
			{
				//IL_001d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0032: Unknown result type (might be due to invalid IL or missing references)
				if (HandleAggro)
				{
					Aggro += 2f / Vector3.Distance(((Component)this).transform.position, (Vector3)StateInvestigate.Get<EnemyStateInvestigate>("onInvestigateTriggeredPosition"));
				}
			});
			component.OnSpawn.AddListener((UnityAction)delegate
			{
				if (Utils.IsHost())
				{
					SetState(TrudgeState.Spawn, 1f);
				}
			});
			val.onDeath.AddListener((UnityAction)delegate
			{
				//IL_0017: Unknown result type (might be due to invalid IL or missing references)
				//IL_0044: Unknown result type (might be due to invalid IL or missing references)
				//IL_0071: 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_00cb: Unknown result type (might be due to invalid IL or missing references)
				//IL_0109: Unknown result type (might be due to invalid IL or missing references)
				//IL_0138: Unknown result type (might be due to invalid IL or missing references)
				((Component)ParticleDeathImpact).transform.position = Enemy.CenterTransform.position;
				ParticleDeathImpact.Play();
				((Component)ParticleDeathBitsFar).transform.position = Enemy.CenterTransform.position;
				ParticleDeathBitsFar.Play();
				((Component)ParticleDeathBitsShort).transform.position = Enemy.CenterTransform.position;
				ParticleDeathBitsShort.Play();
				((Component)ParticleDeathSmoke).transform.position = Enemy.CenterTransform.position;
				ParticleDeathSmoke.Play();
				EnemyAnimator.sfxDeath.Play(((Component)EnemyAnimator).transform.position, 1f, 1f, 1f, 1f);
				GameDirector.instance.CameraShake.ShakeDistance(3f, 3f, 10f, ((Component)this).transform.position, 0.5f);
				GameDirector.instance.CameraImpact.ShakeDistance(3f, 3f, 10f, ((Component)this).transform.position, 0.05f);
				if (Utils.IsHost())
				{
					EnemyParent.Despawn();
					SetState(TrudgeState.Spawn, 1f);
				}
			});
			val.onHurt.AddListener((UnityAction)delegate
			{
				if (HandleAggro)
				{
					Aggro += 15f;
				}
			});
		}

		public void Update()
		{
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Invalid comparison between Unknown and I4
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			if (Utils.IsHost() && State.State != TrudgeState.DestroyTarget && (OverhaulDirector.Instance.ExtractionCompletedImpulse || OverhaulDirector.Instance.ExtractionUnlockedImpulse))
			{
				TargetClosestApproach = float.PositiveInfinity;
				SetState(TrudgeState.Idle, 0f);
			}
			EnemyParent.SpawnedTimerPause(float.PositiveInfinity);
			if ((int

plugins/Frogpocalypse.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("")]
[assembly: AssemblyCompany("Omniscye")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("Frogpocalypse")]
[assembly: AssemblyTitle("Frogpocalypse")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.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;
		}
	}
}
[HarmonyPatch]
public class FrogChaosPatch
{
	private static Dictionary<FrogTrap, float> frogDuplicationTimers = new Dictionary<FrogTrap, float>();

	private static Dictionary<FrogTrap, float> frogJumpTimers = new Dictionary<FrogTrap, float>();

	private static List<FrogTrap> allFrogs = new List<FrogTrap>();

	[HarmonyPatch(typeof(FrogTrap), "Start")]
	[HarmonyPostfix]
	private static void InitializeFrogChaos(FrogTrap __instance)
	{
		if (!allFrogs.Contains(__instance))
		{
			allFrogs.Add(__instance);
			frogDuplicationTimers[__instance] = 3f;
			frogJumpTimers[__instance] = 1f;
			Debug.Log((object)"Frog Chaos initialized!");
		}
	}

	[HarmonyPatch(typeof(FrogTrap), "Update")]
	[HarmonyPostfix]
	private static void UpdateFrogChaos(FrogTrap __instance)
	{
		allFrogs.RemoveAll((FrogTrap f) => (Object)(object)f == (Object)null);
		if (!allFrogs.Contains(__instance))
		{
			allFrogs.Add(__instance);
			frogDuplicationTimers[__instance] = 3f;
			frogJumpTimers[__instance] = 1f;
		}
		if (__instance.everPickedUp)
		{
			if (!((Trap)__instance).trapActive)
			{
				((Trap)__instance).trapActive = true;
				((Trap)__instance).trapStart = true;
				((Trap)__instance).trapTriggered = true;
			}
			((Trap)__instance).enemyInvestigate = true;
			if (frogJumpTimers.TryGetValue(__instance, out var value))
			{
				frogJumpTimers[__instance] = value - Time.deltaTime;
				if (frogJumpTimers[__instance] <= 0f)
				{
					frogJumpTimers[__instance] = Random.Range(1f, 2.5f);
					__instance.FrogJump();
				}
			}
			if (frogDuplicationTimers.TryGetValue(__instance, out var value2))
			{
				frogDuplicationTimers[__instance] = value2 - Time.deltaTime;
				if (frogDuplicationTimers[__instance] <= 0f)
				{
					Debug.Log((object)"Cloning frog...");
					frogDuplicationTimers[__instance] = 0.5f;
					SpawnPhysicsOnlyFrog(__instance);
				}
			}
		}
		else
		{
			((Trap)__instance).trapActive = false;
			((Trap)__instance).trapStart = false;
			((Trap)__instance).trapTriggered = false;
		}
	}

	private static void SpawnPhysicsOnlyFrog(FrogTrap originalFrog)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0062: 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_0256: Unknown result type (might be due to invalid IL or missing references)
		//IL_0287: Unknown result type (might be due to invalid IL or missing references)
		//IL_0295: Unknown result type (might be due to invalid IL or missing references)
		//IL_029f: Unknown result type (might be due to invalid IL or missing references)
		try
		{
			Vector3 val = ((Component)originalFrog).transform.position + new Vector3(Random.Range(-3f, 3f), Random.Range(1f, 2f), Random.Range(-3f, 3f));
			GameObject val2 = Object.Instantiate<GameObject>(((Component)originalFrog).gameObject, val, Quaternion.Euler(0f, (float)Random.Range(0, 360), 0f));
			PhotonView component = val2.GetComponent<PhotonView>();
			if ((Object)(object)component != (Object)null)
			{
				Object.DestroyImmediate((Object)(object)component);
			}
			Component[] componentsInChildren = val2.GetComponentsInChildren<Component>(true);
			Component[] array = componentsInChildren;
			foreach (Component val3 in array)
			{
				if ((Object)(object)val3 == (Object)null)
				{
					continue;
				}
				string name = ((object)val3).GetType().Name;
				if (val3 is Transform || val3 is MeshRenderer || val3 is SkinnedMeshRenderer || val3 is MeshFilter || val3 is Collider || val3 is Rigidbody)
				{
					continue;
				}
				if (name == "AudioLowPassFilter")
				{
					Behaviour val4 = (Behaviour)(object)((val3 is Behaviour) ? val3 : null);
					if (val4 != null)
					{
						val4.enabled = false;
					}
					continue;
				}
				AudioSource val5 = (AudioSource)(object)((val3 is AudioSource) ? val3 : null);
				if (val5 != null)
				{
					val5.volume = 0f;
					((Behaviour)val5).enabled = false;
					continue;
				}
				if (name.Contains("Photon") || name.Contains("RPC") || name.Contains("Interact") || name.Contains("Valuable") || name.Contains("Grab") || name.Contains("Discover"))
				{
					Object.DestroyImmediate((Object)(object)val3);
					continue;
				}
				MonoBehaviour val6 = (MonoBehaviour)(object)((val3 is MonoBehaviour) ? val3 : null);
				if (val6 != null)
				{
					((Behaviour)val6).enabled = false;
					continue;
				}
				try
				{
					Object.DestroyImmediate((Object)(object)val3);
				}
				catch
				{
				}
			}
			Rigidbody val7 = val2.GetComponent<Rigidbody>() ?? val2.AddComponent<Rigidbody>();
			val7.isKinematic = false;
			val7.useGravity = true;
			val7.mass = 1f;
			val7.AddForce(Vector3.up * 1.5f, (ForceMode)1);
			val7.AddForce(new Vector3(Random.Range(-0.5f, 0.5f), 0f, Random.Range(-0.5f, 0.5f)), (ForceMode)1);
			val7.AddTorque(Random.insideUnitSphere * 3f, (ForceMode)1);
			Debug.Log((object)"Cloned frog dropped (physics-only)");
		}
		catch (Exception ex)
		{
			Debug.LogError((object)("Frog clone spawn failed: " + ex.Message));
		}
	}
}
namespace Frogpocalypse
{
	[BepInPlugin("Omniscye.Frogpocalypse", "Frogpocalypse", "1.0")]
	public class Frogpocalypse : BaseUnityPlugin
	{
		internal static Frogpocalypse Instance { get; private set; }

		internal static ManualLogSource Logger => Instance._logger;

		private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger;

		internal Harmony? Harmony { get; set; }

		private void Awake()
		{
			Instance = this;
			((Component)this).gameObject.transform.parent = null;
			((Object)((Component)this).gameObject).hideFlags = (HideFlags)61;
			Patch();
			Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!");
		}

		internal void Patch()
		{
			//IL_001a: 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_0021: Expected O, but got Unknown
			//IL_0026: Expected O, but got Unknown
			if (Harmony == null)
			{
				Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID);
				Harmony val2 = val;
				Harmony = val;
			}
			Harmony.PatchAll();
		}

		internal void Unpatch()
		{
			Harmony? harmony = Harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
		}

		private void Update()
		{
		}
	}
}

plugins/Krild_CCTV_Stalk_Ur_Friends.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using TMPro;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("Krild_CCTV_Stalk_Ur_Friends")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Krild_CCTV_Stalk_Ur_Friends")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("f9a19156-27fa-4b94-a2ba-7e6aa68056c5")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace Krild_CCTV_Stalk_Ur_Friends
{
	[BepInPlugin("KrildCCTV", "CCTV_Stalk_Ur_Friends", "1.0.0.0")]
	public class KrildPatcher : BaseUnityPlugin
	{
		private const string modGUID = "KrildCCTV";

		private const string modName = "CCTV_Stalk_Ur_Friends";

		private const string modVersion = "1.0.0.0";

		public ConfigEntry<Vector3> _CameraPlayerLocalPositionOverview;

		public ConfigEntry<float> _CameraPlayerLocalPositionX;

		public ConfigEntry<float> _CameraPlayerLocalPositionY;

		public ConfigEntry<float> _CameraPlayerLocalPositionZ;

		public Vector3 _CameraPlayerLocalPosition;

		public ConfigEntry<float> _CameraPlayerClippingPlaneNear;

		public ConfigEntry<float> _CameraFOV;

		internal Harmony harmony = new Harmony("KrildCCTV");

		internal static KrildPatcher current;

		internal ManualLogSource log;

		private void Awake()
		{
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Expected O, but got Unknown
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Expected O, but got Unknown
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Expected O, but got Unknown
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0191: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Expected O, but got Unknown
			//IL_01cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d9: Expected O, but got Unknown
			if ((Object)(object)current == (Object)null)
			{
				current = this;
			}
			log = Logger.CreateLogSource("KrildCCTV");
			((Component)this).gameObject.transform.parent = null;
			((Object)((Component)this).gameObject).hideFlags = (HideFlags)61;
			_CameraPlayerLocalPositionOverview = ((BaseUnityPlugin)this).Config.Bind<Vector3>("PlayerLocalCameraPosition", "CameraPlayerLocalPosition", new Vector3(0f, 0f, 0.3f), "Local Camera Offset, when switched to a Player. Position (0,0,0) is in the middle of the Head. So there is a offset needed, to not render the head itselfs (eg. The Eyes or cosmetics).");
			_CameraPlayerLocalPositionX = ((BaseUnityPlugin)this).Config.Bind<float>("PlayerLocalCameraPosition", "CameraPlayerLocalPositionX", 0f, new ConfigDescription("Vector X", (AcceptableValueBase)(object)new AcceptableValueRange<float>(-1f, 1f), Array.Empty<object>()));
			_CameraPlayerLocalPositionY = ((BaseUnityPlugin)this).Config.Bind<float>("PlayerLocalCameraPosition", "CameraPlayerLocalPositionY", 0f, new ConfigDescription("Vector Y", (AcceptableValueBase)(object)new AcceptableValueRange<float>(-1f, 1f), Array.Empty<object>()));
			_CameraPlayerLocalPositionZ = ((BaseUnityPlugin)this).Config.Bind<float>("PlayerLocalCameraPosition", "CameraPlayerLocalPositionZ", 0.3f, new ConfigDescription("Vector Z", (AcceptableValueBase)(object)new AcceptableValueRange<float>(-1f, 1f), Array.Empty<object>()));
			_CameraPlayerLocalPosition = new Vector3(_CameraPlayerLocalPositionX.Value, _CameraPlayerLocalPositionY.Value, _CameraPlayerLocalPositionZ.Value);
			_CameraPlayerClippingPlaneNear = ((BaseUnityPlugin)this).Config.Bind<float>("PlayerLocalCamera", "CameraPlayerClippingPlaneNear", 0.01f, new ConfigDescription("The distance from the Camera where rendering starts. Higher Value means u can look throw walls.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.01f, 1f), Array.Empty<object>()));
			_CameraFOV = ((BaseUnityPlugin)this).Config.Bind<float>("LocalCamera", "CameraFOV", 90f, new ConfigDescription("Camera FOV", (AcceptableValueBase)(object)new AcceptableValueRange<float>(30f, 150f), Array.Empty<object>()));
			Patch();
			log.LogInfo((object)"Krildig geladen :3 You can stalk ur friends now!");
		}

		internal void Patch()
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Expected O, but got Unknown
			if (harmony == null)
			{
				Harmony val = (harmony = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID));
			}
			harmony.PatchAll();
		}

		public void WriteLog(string message)
		{
			log.LogInfo((object)message);
		}
	}
}
namespace Krild_CCTV_Stalk_Ur_Friends.Behaviours
{
	public class KrildCameraManager : MonoBehaviour
	{
		public static KrildCameraManager current;

		public List<KrildItemCamera> externalCameraItems;

		private void Awake()
		{
			current = this;
			externalCameraItems = new List<KrildItemCamera>();
		}

		public void AddElement(KrildItemCamera item)
		{
			externalCameraItems.Add(item);
		}

		public KrildItemCamera GetElement(int index)
		{
			return externalCameraItems[index];
		}

		public void RemoveElement(KrildItemCamera item)
		{
			externalCameraItems.Remove(item);
		}
	}
	public class KrildItemCamera : MonoBehaviour
	{
		[SerializeField]
		public Transform viewPoint;

		public string nameCamera;

		private void Start()
		{
			if ((Object)(object)KrildCameraManager.current == (Object)null)
			{
				GameObject.Find("Pun Manager").AddComponent<KrildCameraManager>();
			}
			SubscribeToCameraList();
			nameCamera = "Item Camera " + KrildCameraManager.current.externalCameraItems.Count;
		}

		private void SubscribeToCameraList()
		{
			if ((Object)(object)KrildCameraManager.current != (Object)null)
			{
				KrildCameraManager.current.externalCameraItems.Add(this);
			}
		}
	}
	public class KrildItemMonitor : MonoBehaviour
	{
		[Serializable]
		public class CCTVPlayer
		{
			public string name;

			public Transform localCameraTransform;

			public PlayerAvatar playerAvatar;

			public Transform localDeathHeadTransform = null;

			public CCTVPlayer(string value1, Transform value2, PlayerAvatar value3)
			{
				name = value1;
				localCameraTransform = value2;
				playerAvatar = value3;
			}

			public void SetDeadHead(Transform value1)
			{
				localDeathHeadTransform = value1;
			}
		}

		[SerializeField]
		private Camera cameraItem;

		private Transform cameraTransform;

		[SerializeField]
		private Material materialRenderTexture;

		[SerializeField]
		private Material materialNoSignal;

		[SerializeField]
		private MeshRenderer screenRenderer;

		[SerializeField]
		private TMP_Text textCamName;

		private string defaultTextCamName = "Error :c";

		private ItemToggle itemToggle;

		private bool prevToggleState;

		private Transform transformShipCam;

		private KrildItemCamera activeCamera = null;

		private bool moveCameraSucces = false;

		private bool noSignal = false;

		private bool playerAlive = true;

		private int maxPlayer = 1;

		private int index;

		private List<CCTVPlayer> listPlayerSorted;

		private Vector3 cameraPlayerLocalPosition;

		private float cameraPlayerClippingPlaneNear;

		private float cameraFOV;

		private void Start()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			cameraPlayerLocalPosition = KrildPatcher.current._CameraPlayerLocalPositionOverview.Value;
			cameraPlayerClippingPlaneNear = KrildPatcher.current._CameraPlayerClippingPlaneNear.Value;
			cameraFOV = KrildPatcher.current._CameraFOV.Value;
			cameraTransform = ((Component)cameraItem).transform;
			cameraItem.fieldOfView = cameraFOV;
			itemToggle = ((Component)this).gameObject.GetComponent<ItemToggle>();
			SetCamName(defaultTextCamName);
			transformShipCam = GameObject.Find("cctv camera").transform;
			SetShipCam();
			SetMaxPlayer();
			SortPlayerAvatars();
			if ((Object)(object)KrildCameraManager.current == (Object)null)
			{
				GameObject.Find("Pun Manager").AddComponent<KrildCameraManager>();
			}
			((MonoBehaviour)this).StartCoroutine(WaitAndLoadDeadHead());
		}

		private void SortPlayerAvatars()
		{
			List<string> list = new List<string>();
			listPlayerSorted = new List<CCTVPlayer>();
			foreach (PlayerAvatar player in GameDirector.instance.PlayerList)
			{
				list.Add(SemiFunc.PlayerGetName(player));
			}
			list.Sort();
			foreach (string item in list)
			{
				for (int i = 0; i < list.Count; i++)
				{
					if (item == SemiFunc.PlayerGetName(GameDirector.instance.PlayerList[i]))
					{
						listPlayerSorted.Add(new CCTVPlayer(item, GameDirector.instance.PlayerList[i].localCameraTransform, GameDirector.instance.PlayerList[i]));
					}
				}
			}
		}

		private void Update()
		{
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			if (itemToggle.toggleState == prevToggleState)
			{
				return;
			}
			moveCameraSucces = false;
			prevToggleState = itemToggle.toggleState;
			index = NextIndex();
			if (index == 0)
			{
				SetShipCam();
			}
			else if (index <= maxPlayer)
			{
				MoveCam(listPlayerSorted[index - 1].localCameraTransform, listPlayerSorted[index - 1].name, cameraPlayerClippingPlaneNear);
				cameraTransform.localPosition = cameraPlayerLocalPosition;
			}
			else if ((Object)(object)KrildCameraManager.current.externalCameraItems[index - 1 - maxPlayer] != (Object)null)
			{
				activeCamera = KrildCameraManager.current.externalCameraItems[index - 1 - maxPlayer];
				if (((Component)activeCamera).transform.localPosition.y < 1000f)
				{
					MoveCam(activeCamera.viewPoint, activeCamera.nameCamera, 0.1f);
				}
			}
			if (moveCameraSucces)
			{
				((Renderer)screenRenderer).material = materialRenderTexture;
				noSignal = false;
				playerAlive = true;
			}
			else
			{
				NoSignal();
			}
		}

		private void SetMaxPlayer()
		{
			maxPlayer = GameDirector.instance.PlayerList.Count;
		}

		private int NextIndex()
		{
			index = (index + 1) % (1 + maxPlayer + KrildCameraManager.current.externalCameraItems.Count);
			return index;
		}

		private void MoveCam(Transform transform, string value, float value2)
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			cameraTransform.SetParent(transform);
			cameraTransform.localPosition = Vector3.zero;
			cameraTransform.localRotation = Quaternion.identity;
			cameraItem.nearClipPlane = value2;
			SetCamName(value);
			moveCameraSucces = true;
		}

		private void SetCamName(string value)
		{
			if (value == "")
			{
				textCamName.text = "Cam " + (index + 1) + ": " + defaultTextCamName;
			}
			else
			{
				textCamName.text = "Cam " + (index + 1) + ": " + value;
			}
		}

		private void NoSignal()
		{
			((Renderer)screenRenderer).material = materialNoSignal;
			SetCamName("");
			noSignal = true;
		}

		private void SetShipCam()
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			index = 0;
			MoveCam(transformShipCam, "Ship Camera", 0.6f);
			cameraTransform.localPosition = new Vector3(0.4f, -0.1f, 0f);
			cameraTransform.localRotation = new Quaternion(0f, 0.757f, 0f, 0.653f);
		}

		private IEnumerator WaitAndLoadDeadHead()
		{
			yield return (object)new WaitForSeconds(3f);
			foreach (CCTVPlayer item in listPlayerSorted)
			{
				for (int i = 0; i < 20; i++)
				{
					if ((Object)(object)item.playerAvatar.playerDeathHead == (Object)null)
					{
						yield return (object)new WaitForSeconds(1f);
						continue;
					}
					item.SetDeadHead(((Component)item.playerAvatar.playerDeathHead).transform);
					break;
				}
			}
			((MonoBehaviour)this).StartCoroutine(CheckCameraState());
		}

		private IEnumerator CheckCameraState()
		{
			if (index > maxPlayer)
			{
				if ((Object)(object)activeCamera == (Object)null)
				{
					NoSignal();
				}
				else if (((Component)activeCamera).transform.localPosition.y > 1000f)
				{
					NoSignal();
				}
				else if (noSignal)
				{
					((Renderer)screenRenderer).material = materialRenderTexture;
					MoveCam(activeCamera.viewPoint, activeCamera.nameCamera, 0.1f);
					noSignal = false;
				}
			}
			else if (index > 0 && listPlayerSorted[index - 1] != null && (Object)(object)listPlayerSorted[index - 1].localDeathHeadTransform != (Object)null)
			{
				if (listPlayerSorted[index - 1].localDeathHeadTransform.position.y > 1000f)
				{
					if (!playerAlive)
					{
						MoveCam(listPlayerSorted[index - 1].localCameraTransform, listPlayerSorted[index - 1].name, cameraPlayerClippingPlaneNear);
						cameraTransform.localPosition = cameraPlayerLocalPosition;
						playerAlive = true;
					}
				}
				else if (playerAlive)
				{
					MoveCam(listPlayerSorted[index - 1].localDeathHeadTransform, listPlayerSorted[index - 1].name, 0.1f);
					playerAlive = false;
				}
			}
			yield return (object)new WaitForSeconds(0.25f);
			((MonoBehaviour)this).StartCoroutine(CheckCameraState());
		}
	}
}

plugins/me.loaforc.soundapi.dll

Decompiled 2 months ago
using System;
using System.Buffers;
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;
using System.Threading;
using System.Threading.Tasks;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using JetBrains.Annotations;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;
using loaforcsSoundAPI.Core;
using loaforcsSoundAPI.Core.Data;
using loaforcsSoundAPI.Core.JSON;
using loaforcsSoundAPI.Core.Networking;
using loaforcsSoundAPI.Core.Patches;
using loaforcsSoundAPI.Core.Util;
using loaforcsSoundAPI.Core.Util.Extensions;
using loaforcsSoundAPI.Reporting;
using loaforcsSoundAPI.Reporting.Data;
using loaforcsSoundAPI.SoundPacks;
using loaforcsSoundAPI.SoundPacks.Data;
using loaforcsSoundAPI.SoundPacks.Data.Conditions;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("me.loaforc.soundapi")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("2.0.8.0")]
[assembly: AssemblyInformationalVersion("2.0.8+02f5b90764ee9441879eaa0c04ef15b7674b7d42")]
[assembly: AssemblyProduct("loaforcsSoundAPI")]
[assembly: AssemblyTitle("me.loaforc.soundapi")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("2.0.8.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace loaforcsSoundAPI
{
	[BepInPlugin("me.loaforc.soundapi", "loaforcsSoundAPI", "2.0.8")]
	internal class loaforcsSoundAPI : BaseUnityPlugin
	{
		private static loaforcsSoundAPI _instance;

		internal static ManualLogSource Logger { get; private set; }

		private void Awake()
		{
			_instance = this;
			Logger = Logger.CreateLogSource("me.loaforc.soundapi");
			((BaseUnityPlugin)this).Config.SaveOnConfigSet = false;
			Logger.LogInfo((object)"Setting up config");
			Debuggers.Bind(((BaseUnityPlugin)this).Config);
			SoundReportHandler.Bind(((BaseUnityPlugin)this).Config);
			PatchConfig.Bind(((BaseUnityPlugin)this).Config);
			PackLoadingConfig.Bind(((BaseUnityPlugin)this).Config);
			Logger.LogInfo((object)"Running patches");
			Harmony harmony = Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "me.loaforc.soundapi");
			UnityObjectPatch.Init(harmony);
			Logger.LogInfo((object)"Registering data");
			SoundAPI.RegisterAll(Assembly.GetExecutingAssembly());
			SoundAPIAudioManager.SpawnManager();
			SoundReplacementHandler.Register();
			((BaseUnityPlugin)this).Config.Save();
			Logger.LogInfo((object)"me.loaforc.soundapi by loaforc has loaded :3");
		}

		internal static ConfigFile GenerateConfigFile(string name, BepInPlugin metadata)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			return new ConfigFile(Utility.CombinePaths(new string[2]
			{
				Paths.ConfigPath,
				name + ".cfg"
			}), false, metadata);
		}
	}
	public static class SoundAPI
	{
		public const string PLUGIN_GUID = "me.loaforc.soundapi";

		internal static NetworkAdapter CurrentNetworkAdapter { get; private set; }

		public static async Task<AudioClip> LoadAudioFileAsync(string fullPath)
		{
			if (!File.Exists(fullPath))
			{
				throw new FileNotFoundException("'" + fullPath + "' not found.");
			}
			if (!SoundPackLoadPipeline.audioExtensions.ContainsKey(Path.GetExtension(fullPath)))
			{
				throw new NotImplementedException("Audio file extension: '" + Path.GetExtension(fullPath) + "' is not implemented.");
			}
			UnityWebRequest request = UnityWebRequestMultimedia.GetAudioClip(fullPath, SoundPackLoadPipeline.audioExtensions[Path.GetExtension(fullPath)]);
			await (AsyncOperation)(object)request.SendWebRequest();
			AudioClip content = DownloadHandlerAudioClip.GetContent(request);
			request.Dispose();
			return content;
		}

		public static void RegisterAll(Assembly assembly)
		{
			foreach (Type loadableType in assembly.GetLoadableTypes())
			{
				if (loadableType.IsNested)
				{
					continue;
				}
				foreach (SoundAPIConditionAttribute conditionAttribute in loadableType.GetCustomAttributes<SoundAPIConditionAttribute>())
				{
					if (!typeof(Condition).IsAssignableFrom(loadableType))
					{
						loaforcsSoundAPI.Logger.LogError((object)("Condition: '" + loadableType.FullName + "' has been marked with [SoundAPICondition] but does not extend Condition!"));
						continue;
					}
					ConstructorInfo info = loadableType.GetConstructor(Array.Empty<Type>());
					if (info == null)
					{
						loaforcsSoundAPI.Logger.LogError((object)("Condition: '" + loadableType.FullName + "' has no valid constructor! It must have a constructor with no parameters! If you need extra parameters do not mark it with [SoundAPICondition] and register it manually."));
						continue;
					}
					RegisterCondition(conditionAttribute.ID, delegate
					{
						if (conditionAttribute.IsDeprecated)
						{
							if (conditionAttribute.DeprecationReason == null)
							{
								loaforcsSoundAPI.Logger.LogWarning((object)("Condition: '" + conditionAttribute.ID + "' is deprecated and may be removed in future."));
							}
							else
							{
								loaforcsSoundAPI.Logger.LogWarning((object)("Condition: '" + conditionAttribute.ID + "' is deprecated. " + conditionAttribute.DeprecationReason));
							}
						}
						return (Condition)info.Invoke(Array.Empty<object>());
					});
				}
			}
		}

		public static void RegisterCondition(string id, Func<Condition> factory)
		{
			SoundPackDataHandler.Register(id, factory);
		}

		public static void RegisterNetworkAdapter(NetworkAdapter adapter)
		{
			CurrentNetworkAdapter = adapter;
			loaforcsSoundAPI.Logger.LogInfo((object)("Registered network adapter: '" + CurrentNetworkAdapter.Name + "'"));
			CurrentNetworkAdapter.OnRegister();
		}

		public static void RegisterSoundPack(SoundPack pack)
		{
			if (SoundPackDataHandler.LoadedPacks.Contains(pack))
			{
				throw new InvalidOperationException("Already registered sound-pack: '" + pack.Name + "'!");
			}
			SoundPackDataHandler.AddLoadedPack(pack);
			foreach (SoundReplacementCollection replacementCollection in pack.ReplacementCollections)
			{
				foreach (SoundReplacementGroup replacement in replacementCollection.Replacements)
				{
					SoundPackDataHandler.AddReplacement(replacement);
				}
			}
		}
	}
	internal static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "me.loaforc.soundapi";

		public const string PLUGIN_NAME = "loaforcsSoundAPI";

		public const string PLUGIN_VERSION = "2.0.8";
	}
}
namespace loaforcsSoundAPI.SoundPacks
{
	internal class LoadSoundOperation
	{
		public readonly UnityWebRequest WebRequest = webRequest.webRequest;

		public readonly SoundInstance Sound;

		public bool IsReady => WebRequest.isDone;

		public bool IsDone { get; set; }

		public LoadSoundOperation(SoundInstance soundInstance, UnityWebRequestAsyncOperation webRequest)
		{
			Sound = soundInstance;
			base..ctor();
		}
	}
	internal static class PackLoadingConfig
	{
		internal static bool MetadataSpoofing { get; private set; }

		internal static void Bind(ConfigFile file)
		{
			MetadataSpoofing = file.Bind<bool>("PackLoading", "MetadataSpoofing", true, "Should SoundAPI use a fake BepInPlugin attribute when generating configs? This can fix some issues with mod managers, notably with Gale displaying the config file name, instead of the sound-pack name.").Value;
		}
	}
	internal static class SoundPackDataHandler
	{
		private static List<SoundPack> _loadedPacks = new List<SoundPack>();

		internal static Dictionary<string, List<SoundReplacementGroup>> SoundReplacements = new Dictionary<string, List<SoundReplacementGroup>>();

		internal static Dictionary<string, Func<Condition>> conditionFactories = new Dictionary<string, Func<Condition>>();

		internal static List<AudioClip> allLoadedClips = new List<AudioClip>();

		internal static IReadOnlyList<SoundPack> LoadedPacks => _loadedPacks.AsReadOnly();

		internal static void Register(string id, Func<Condition> factory)
		{
			conditionFactories[id] = factory;
		}

		public static Condition CreateCondition(string id)
		{
			if (conditionFactories.TryGetValue(id, out var value))
			{
				return value();
			}
			return new InvalidCondition(id);
		}

		internal static void AddLoadedPack(SoundPack pack)
		{
			_loadedPacks.Add(pack);
		}

		internal static void AddReplacement(SoundReplacementGroup group)
		{
			foreach (string match in group.Matches)
			{
				string key = match.Split(":").Last();
				if (!SoundReplacements.TryGetValue(key, out var value))
				{
					value = new List<SoundReplacementGroup>();
				}
				if (!value.Contains(group))
				{
					value.Add(group);
					SoundReplacements[key] = value;
				}
			}
		}
	}
	internal static class SoundPackLoadPipeline
	{
		private class SkippedResults
		{
			public int Collections;

			public int Groups;

			public int Sounds;
		}

		private static volatile int _activeThreads;

		private static Dictionary<string, List<string>> mappings;

		internal static Dictionary<string, AudioType> audioExtensions;

		internal static event Action OnFinishedPipeline;

		internal static async void StartPipeline()
		{
			Stopwatch completeLoadingTimer = Stopwatch.StartNew();
			Stopwatch timer = Stopwatch.StartNew();
			List<SoundPack> list = FindAndLoadPacks();
			loaforcsSoundAPI.Logger.LogInfo((object)$"(Step 1) Loading Sound-pack definitions took {timer.ElapsedMilliseconds}ms");
			if (list.Count == 0)
			{
				loaforcsSoundAPI.Logger.LogWarning((object)"No sound-packs were found to load! This can be ignorable if you're doing testing or using SoundAPI for another purpose, but if you expected sound-packs to load you may have set it up incorrectly.");
			}
			timer.Restart();
			List<LoadSoundOperation> webRequestOperations = new List<LoadSoundOperation>();
			foreach (SoundPack item2 in list)
			{
				string path = Path.Combine(item2.PackFolder, "soundapi_mappings.json");
				if (!File.Exists(path))
				{
					continue;
				}
				Dictionary<string, List<string>> dictionary = JSONDataLoader.LoadFromFile<Dictionary<string, List<string>>>(path);
				foreach (KeyValuePair<string, List<string>> item3 in dictionary)
				{
					if (mappings.ContainsKey(item3.Key))
					{
						mappings[item3.Key].AddRange(item3.Value);
					}
					else
					{
						mappings[item3.Key] = item3.Value;
					}
				}
			}
			loaforcsSoundAPI.Logger.LogInfo((object)$"(Step 2) Loading Sound-pack mappings ('{mappings.Count}') took {timer.ElapsedMilliseconds}ms");
			timer.Restart();
			SkippedResults skippedStats = new SkippedResults();
			foreach (SoundPack item4 in list)
			{
				foreach (SoundReplacementCollection item5 in LoadSoundReplacementCollections(item4, ref skippedStats))
				{
					foreach (SoundReplacementGroup replacement in item5.Replacements)
					{
						SoundPackDataHandler.AddReplacement(replacement);
						foreach (SoundInstance sound in replacement.Sounds)
						{
							if (sound.Condition is ConstantCondition constantCondition && !constantCondition.Value)
							{
								Debuggers.SoundReplacementLoader?.Log("skipping a sound in '" + LogFormats.FormatFilePath(item5.FilePath) + "' because sound is marked as constant and has a value of false.");
								skippedStats.Sounds++;
							}
							else
							{
								webRequestOperations.Add(StartWebRequestOperation(item4, sound, audioExtensions[Path.GetExtension(sound.Sound)]));
							}
						}
					}
				}
			}
			int amountOfOperations = webRequestOperations.Count;
			loaforcsSoundAPI.Logger.LogInfo((object)$"(Step 3) Skipped {skippedStats.Collections} collection(s), {skippedStats.Groups} replacement(s), {skippedStats.Sounds} sound(s)");
			loaforcsSoundAPI.Logger.LogInfo((object)$"(Step 3) Loading sound replacement collections took {timer.ElapsedMilliseconds}ms");
			if (SoundReportHandler.CurrentReport != null)
			{
				SoundReportHandler.CurrentReport.AudioClipsLoaded = amountOfOperations;
			}
			loaforcsSoundAPI.Logger.LogInfo((object)$"(Step 4) Started loading {amountOfOperations} audio file(s)");
			loaforcsSoundAPI.Logger.LogInfo((object)"Waiting for splash screens to complete to continue...");
			completeLoadingTimer.Stop();
			await Task.Delay(1);
			loaforcsSoundAPI.Logger.LogInfo((object)"Splash screens done! Continuing pipeline");
			loaforcsSoundAPI.Logger.LogWarning((object)"The game will freeze for a moment!");
			timer.Restart();
			completeLoadingTimer.Start();
			bool flag = false;
			bool threadsShouldExit = false;
			ConcurrentQueue<LoadSoundOperation> queuedOperations = new ConcurrentQueue<LoadSoundOperation>();
			ConcurrentBag<Exception> threadPoolExceptions = new ConcurrentBag<Exception>();
			for (int i = 0; i < 16; i++)
			{
				new Thread((ThreadStart)delegate
				{
					while (queuedOperations.Count == 0 && !threadsShouldExit)
					{
						Thread.Yield();
					}
					Interlocked.Increment(ref _activeThreads);
					Debuggers.SoundReplacementLoader?.Log($"active threads at {_activeThreads}");
					LoadSoundOperation result;
					while (queuedOperations.TryDequeue(out result))
					{
						try
						{
							AudioClip content = DownloadHandlerAudioClip.GetContent(result.WebRequest);
							result.Sound.Clip = content;
							result.WebRequest.Dispose();
							Debuggers.SoundReplacementLoader?.Log("clip generated");
							result.IsDone = true;
						}
						catch (Exception item)
						{
							threadPoolExceptions.Add(item);
						}
					}
					Interlocked.Decrement(ref _activeThreads);
				}).Start();
			}
			while (webRequestOperations.Count > 0)
			{
				foreach (LoadSoundOperation item6 in from operation in webRequestOperations.ToList()
					where operation.IsReady
					select operation)
				{
					queuedOperations.Enqueue(item6);
					webRequestOperations.Remove(item6);
				}
				if (!flag && webRequestOperations.Count < amountOfOperations / 2)
				{
					flag = true;
					loaforcsSoundAPI.Logger.LogInfo((object)"(Step 5) Queued half of the needed operations!");
				}
				Thread.Yield();
			}
			loaforcsSoundAPI.Logger.LogInfo((object)"(Step 5) All file reads are done, waiting for the audio clips conversions.");
			threadsShouldExit = true;
			while (_activeThreads > 0 || webRequestOperations.Any((LoadSoundOperation operation) => !operation.IsDone))
			{
				Thread.Yield();
			}
			loaforcsSoundAPI.Logger.LogInfo((object)$"(Step 6) Took {timer.ElapsedMilliseconds}ms to finish loading audio clips from files");
			if (threadPoolExceptions.Count != 0)
			{
				loaforcsSoundAPI.Logger.LogError((object)$"(Step 6) {threadPoolExceptions.Count} internal error(s) happened while loading:");
				foreach (Exception item7 in threadPoolExceptions)
				{
					loaforcsSoundAPI.Logger.LogError((object)item7.ToString());
				}
			}
			SoundPackLoadPipeline.OnFinishedPipeline();
			mappings = null;
			loaforcsSoundAPI.Logger.LogDebug((object)$"Active Threads that are left over: {_activeThreads}");
			loaforcsSoundAPI.Logger.LogInfo((object)$"Entire load process took an effective {completeLoadingTimer.ElapsedMilliseconds}ms");
		}

		private static List<SoundPack> FindAndLoadPacks(string entryPoint = "sound_pack.json")
		{
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Expected O, but got Unknown
			Dictionary<string, SoundPack> dictionary = new Dictionary<string, SoundPack>();
			string[] files = Directory.GetFiles(Paths.PluginPath, entryPoint, SearchOption.AllDirectories);
			foreach (string text in files)
			{
				Debuggers.SoundReplacementLoader?.Log("found entry point: '" + text + "'!");
				SoundPack soundPack = JSONDataLoader.LoadFromFile<SoundPack>(text);
				if (soundPack == null)
				{
					continue;
				}
				soundPack.PackFolder = Path.GetDirectoryName(text);
				if (dictionary.TryGetValue(soundPack.Name, out var value))
				{
					IValidatable.LogAndCheckValidationResult("loading '" + text + "'", new List<IValidatable.ValidationResult>(1)
					{
						new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, "A sound-pack with name '" + soundPack.Name + "' was already loaded from '" + LogFormats.FormatFilePath(Path.Combine(value.PackFolder, "sound_pack.json")) + "'. Skipping loading the duplicate!!")
					}, soundPack.Logger);
					continue;
				}
				Debuggers.SoundReplacementLoader?.Log("json loaded, validating");
				List<IValidatable.ValidationResult> results = soundPack.Validate();
				if (IValidatable.LogAndCheckValidationResult("loading '" + text + "'", results, soundPack.Logger))
				{
					ConfigFile val = loaforcsSoundAPI.GenerateConfigFile(metadata: (BepInPlugin)((!PackLoadingConfig.MetadataSpoofing) ? ((object)MetadataHelper.GetMetadata(typeof(loaforcsSoundAPI))) : ((object)new BepInPlugin(soundPack.GUID, soundPack.Name, soundPack.Version ?? "1.0.0"))), name: soundPack.GUID);
					val.SaveOnConfigSet = false;
					soundPack.Bind(val);
					if (val.Count > 0)
					{
						val.Save();
					}
					dictionary[soundPack.Name] = soundPack;
					SoundPackDataHandler.AddLoadedPack(soundPack);
					Debuggers.SoundReplacementLoader?.Log("pack folder: " + soundPack.PackFolder);
				}
			}
			Debuggers.SoundReplacementLoader?.Log($"loaded '{dictionary.Count}' packs.");
			return dictionary.Values.ToList();
		}

		private static List<SoundReplacementCollection> LoadSoundReplacementCollections(SoundPack pack, ref SkippedResults skippedStats)
		{
			List<SoundReplacementCollection> list = new List<SoundReplacementCollection>();
			if (!Directory.Exists(Path.Combine(pack.PackFolder, "replacers")))
			{
				return list;
			}
			Debuggers.SoundReplacementLoader?.Log("start loading '" + pack.Name + "'!");
			string[] files = Directory.GetFiles(Path.Combine(pack.PackFolder, "replacers"), "*.json", SearchOption.AllDirectories);
			foreach (string text in files)
			{
				Debuggers.SoundReplacementLoader?.Log("found replacer: '" + text + "'!");
				SoundReplacementCollection soundReplacementCollection = JSONDataLoader.LoadFromFile<SoundReplacementCollection>(text);
				if (soundReplacementCollection == null)
				{
					continue;
				}
				soundReplacementCollection.Pack = pack;
				if (soundReplacementCollection.Condition is ConstantCondition constantCondition && !constantCondition.Value)
				{
					Debuggers.SoundReplacementLoader?.Log("skipping '" + LogFormats.FormatFilePath(soundReplacementCollection.FilePath) + "' because collection is marked as constant and has a value of false.");
					skippedStats.Collections++;
				}
				else
				{
					if (!IValidatable.LogAndCheckValidationResult("loading '" + LogFormats.FormatFilePath(text) + "'", soundReplacementCollection.Validate(), pack.Logger))
					{
						continue;
					}
					List<IValidatable.ValidationResult> list2 = new List<IValidatable.ValidationResult>();
					foreach (SoundReplacementGroup replacement in soundReplacementCollection.Replacements)
					{
						replacement.Parent = soundReplacementCollection;
						if (replacement.Condition is ConstantCondition constantCondition2 && !constantCondition2.Value)
						{
							Debuggers.SoundReplacementLoader?.Log("skipping a replacement in '" + LogFormats.FormatFilePath(soundReplacementCollection.FilePath) + "' because group is marked as constant and has a value of false.");
							skippedStats.Groups++;
							continue;
						}
						List<IValidatable.ValidationResult> list3 = replacement.Validate();
						foreach (string item in replacement.Matches.ToList())
						{
							if (item.StartsWith("#"))
							{
								replacement.Matches.Remove(item);
								Dictionary<string, List<string>> dictionary = mappings;
								string text2 = item;
								if (dictionary.TryGetValue(text2.Substring(1, text2.Length - 1), out var value))
								{
									replacement.Matches.AddRange(value);
								}
								else
								{
									list3.Add(new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, "Mapping: '" + item + "' has not been found. If it's part of a soft dependency, make sure to use a 'mod_installed' condition with 'constant' enabled."));
								}
							}
						}
						if (list3.Count != 0)
						{
							list2.AddRange(list3);
							continue;
						}
						foreach (SoundInstance sound in replacement.Sounds)
						{
							sound.Parent = replacement;
							list3.AddRange(sound.Validate());
						}
						if (list3.Count != 0)
						{
							list2.AddRange(list3);
							continue;
						}
						List<string> collection = replacement.Matches.Select((string match) => (match.Split(":").Length != 2) ? match : ("*:" + match)).ToList();
						replacement.Matches.Clear();
						replacement.Matches.AddRange(collection);
					}
					if (IValidatable.LogAndCheckValidationResult("loading '" + LogFormats.FormatFilePath(text) + "'", list2, pack.Logger))
					{
						list.Add(soundReplacementCollection);
					}
				}
			}
			return list;
		}

		private static LoadSoundOperation StartWebRequestOperation(SoundPack pack, SoundInstance sound, AudioType type)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			string text = Path.Combine(pack.PackFolder, "sounds", sound.Sound);
			UnityWebRequest audioClip = UnityWebRequestMultimedia.GetAudioClip(text, type);
			return new LoadSoundOperation(sound, audioClip.SendWebRequest());
		}

		static SoundPackLoadPipeline()
		{
			SoundPackLoadPipeline.OnFinishedPipeline = delegate
			{
			};
			mappings = new Dictionary<string, List<string>>();
			audioExtensions = new Dictionary<string, AudioType>
			{
				{
					".ogg",
					(AudioType)14
				},
				{
					".wav",
					(AudioType)20
				},
				{
					".mp3",
					(AudioType)13
				}
			};
		}
	}
	internal static class SoundReplacementHandler
	{
		private const int TOKEN_PARENT_NAME = 0;

		private const int TOKEN_OBJECT_NAME = 1;

		private const int TOKEN_CLIP_NAME = 2;

		private static readonly string[] _suffixesToRemove = new string[1] { "(Clone)" };

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

		private static readonly StringBuilder _builder = new StringBuilder();

		internal static void Register()
		{
			SceneManager.sceneLoaded += delegate(Scene scene, LoadSceneMode _)
			{
				//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)
				_cachedObjectNames.Clear();
				AudioSource[] array = Object.FindObjectsOfType<AudioSource>(true);
				foreach (AudioSource val in array)
				{
					if (!(((Component)val).gameObject.scene != scene))
					{
						CheckAudioSource(val);
					}
				}
			};
		}

		internal static void CheckAudioSource(AudioSource source)
		{
			if (!source.playOnAwake || !((Behaviour)source).enabled)
			{
				return;
			}
			AudioSourceAdditionalData orCreate = AudioSourceAdditionalData.GetOrCreate(source);
			if (TryReplaceAudio(source, orCreate.OriginalClip, out var replacement))
			{
				source.Stop();
				if (!((Object)(object)replacement == (Object)null))
				{
					orCreate.RealClip = replacement;
					source.Play();
				}
			}
		}

		internal static bool TryReplaceAudio(AudioSource source, AudioClip clip, out AudioClip replacement)
		{
			replacement = null;
			if ((Object)(object)((Component)source).gameObject == (Object)null)
			{
				return false;
			}
			AudioSourceAdditionalData orCreate = AudioSourceAdditionalData.GetOrCreate(source);
			if (orCreate.ReplacedWith != null && orCreate.ReplacedWith.Parent.UpdateEveryFrame)
			{
				return false;
			}
			if (orCreate.DisableReplacing)
			{
				return false;
			}
			string[] name = ArrayPool<string>.Shared.Rent(3);
			if (!TryProcessName(ref name, source, clip) || !TryGetReplacementClip(name, out var group, out var clip2, orCreate.CurrentContext ?? DefaultConditionContext.DEFAULT))
			{
				ArrayPool<string>.Shared.Return(name);
				return false;
			}
			ArrayPool<string>.Shared.Return(name);
			((Object)clip2).name = ((Object)clip).name;
			replacement = clip2;
			orCreate.ReplacedWith = group;
			if (group.Parent.UpdateEveryFrame)
			{
				Debuggers.UpdateEveryFrame?.Log("swapped to a clip that uses update_every_frame !!!");
			}
			return true;
		}

		private static string TrimObjectName(GameObject gameObject)
		{
			if (_cachedObjectNames.ContainsKey(((object)gameObject).GetHashCode()))
			{
				return _cachedObjectNames[((object)gameObject).GetHashCode()];
			}
			_builder.Clear();
			_builder.Append(((Object)gameObject).name);
			string[] suffixesToRemove = _suffixesToRemove;
			foreach (string oldValue in suffixesToRemove)
			{
				_builder.Replace(oldValue, string.Empty);
			}
			for (int j = 0; j < _builder.Length; j++)
			{
				if (_builder[j] == '(')
				{
					int num = j;
					for (j++; j < _builder.Length && char.IsDigit(_builder[j]); j++)
					{
					}
					if (j < _builder.Length && _builder[j] == ')')
					{
						_builder.Remove(num, j - num + 1);
						j = num - 1;
					}
				}
			}
			int num2 = _builder.Length;
			while (num2 > 0 && _builder[num2 - 1] == ' ')
			{
				num2--;
			}
			_builder.Remove(num2, _builder.Length - num2);
			string text = _builder.ToString();
			_cachedObjectNames[((object)gameObject).GetHashCode()] = text;
			return text;
		}

		private static bool TryProcessName(ref string[] name, AudioSource source, AudioClip clip)
		{
			if ((Object)(object)clip == (Object)null)
			{
				return false;
			}
			if ((Object)(object)((Component)source).transform.parent == (Object)null)
			{
				name[0] = "*";
			}
			else
			{
				name[0] = TrimObjectName(((Component)((Component)source).transform.parent).gameObject);
			}
			name[1] = TrimObjectName(((Component)source).gameObject);
			name[2] = ((Object)clip).name;
			if (SoundReportHandler.CurrentReport != null)
			{
				string caller;
				try
				{
					caller = new StackTrace(fNeedFileInfo: true).GetFrame(5).GetMethod().DeclaringType.Name;
				}
				catch
				{
					caller = "unknown caller";
				}
				SoundReport.PlayedSound playedSound = new SoundReport.PlayedSound(name[0] + ":" + name[1] + ":" + name[2], caller, source.playOnAwake);
				if (!SoundReportHandler.CurrentReport.PlayedSounds.Any(playedSound.Equals))
				{
					SoundReportHandler.CurrentReport.PlayedSounds.Add(playedSound);
				}
			}
			Debuggers.MatchStrings?.Log(name[0] + ":" + name[1] + ":" + name[2]);
			return true;
		}

		private static bool TryGetReplacementClip(string[] name, out SoundReplacementGroup group, out AudioClip clip, IContext context)
		{
			group = null;
			clip = null;
			if (name == null)
			{
				return false;
			}
			Debuggers.SoundReplacementHandler?.Log("beginning replacement attempt for " + name[2]);
			if (!SoundPackDataHandler.SoundReplacements.TryGetValue(name[2], out var value))
			{
				return false;
			}
			Debuggers.SoundReplacementHandler?.Log("sound dictionary hit");
			value = value.Where((SoundReplacementGroup it) => it.Parent.Evaluate(context) && it.Evaluate(context) && CheckGroupMatches(it, name)).ToList();
			if (value.Count == 0)
			{
				return false;
			}
			Debuggers.SoundReplacementHandler?.Log("sound group that matches");
			group = value[Random.Range(0, value.Count)];
			List<SoundInstance> list = group.Sounds.Where((SoundInstance it) => it.Evaluate(context)).ToList();
			if (list.Count == 0)
			{
				return false;
			}
			Debuggers.SoundReplacementHandler?.Log("has valid sounds");
			int totalWeight = 0;
			list.ForEach(delegate(SoundInstance replacement)
			{
				totalWeight += replacement.Weight;
			});
			int num = Random.Range(0, totalWeight + 1);
			SoundInstance soundInstance = null;
			foreach (SoundInstance item in list)
			{
				soundInstance = item;
				num -= soundInstance.Weight;
				if (num <= 0)
				{
					break;
				}
			}
			clip = soundInstance.Clip;
			Debuggers.SoundReplacementHandler?.Log("done, dumping stack trace!");
			Debuggers.SoundReplacementHandler?.Log(string.Join(", ", group.Matches));
			Debuggers.SoundReplacementHandler?.Log(((Object)clip).name);
			Debuggers.SoundReplacementHandler?.Log(new StackTrace(fNeedFileInfo: true).ToString().Trim());
			return true;
		}

		private static bool CheckGroupMatches(SoundReplacementGroup group, string[] a)
		{
			foreach (string match in group.Matches)
			{
				if (MatchStrings(a, match))
				{
					return true;
				}
			}
			return false;
		}

		private static bool MatchStrings(string[] a, string b)
		{
			string[] array = b.Split(":");
			if (array[0] != "*" && array[0] != a[0])
			{
				return false;
			}
			if (array[1] != "*" && array[1] != a[1])
			{
				return false;
			}
			return a[2] == array[2];
		}
	}
}
namespace loaforcsSoundAPI.SoundPacks.Data
{
	public interface IPackData
	{
		SoundPack Pack { get; internal set; }
	}
	public class SoundInstance : Conditional
	{
		[field: NonSerialized]
		public SoundReplacementGroup Parent { get; internal set; }

		public string Sound { get; private set; }

		public int Weight { get; private set; }

		[field: NonSerialized]
		public AudioClip Clip { get; internal set; }

		public override SoundPack Pack
		{
			get
			{
				return Parent.Pack;
			}
			set
			{
				if (Parent.Pack != null)
				{
					throw new InvalidOperationException("Pack has already been set.");
				}
				Parent.Pack = value;
			}
		}

		[JsonConstructor]
		internal SoundInstance()
		{
		}

		public SoundInstance(SoundReplacementGroup parent, int weight, AudioClip clip)
		{
			Parent = parent;
			Weight = weight;
			Clip = clip;
			parent.AddSoundReplacement(this);
		}

		public override List<IValidatable.ValidationResult> Validate()
		{
			List<IValidatable.ValidationResult> list = base.Validate();
			if (!File.Exists(Path.Combine(Pack.PackFolder, "sounds", Sound)))
			{
				list.Add(new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, "Sound '" + Sound + "' couldn't be found or doesn't exist!"));
			}
			else if (!SoundPackLoadPipeline.audioExtensions.ContainsKey(Path.GetExtension(Sound)))
			{
				list.Add(new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, "Audio type: '" + Path.GetExtension(Sound) + "' is not supported!"));
			}
			return list;
		}
	}
	public class SoundPack : IValidatable
	{
		[NonSerialized]
		private readonly Dictionary<string, object> _configData = new Dictionary<string, object>();

		private ManualLogSource _logger;

		[JsonProperty]
		private Dictionary<string, JObject> config { get; set; }

		public string Name { get; private set; }

		public string GUID => "soundpack." + Name;

		[CanBeNull]
		public string Version { get; private set; }

		public string PackFolder { get; internal set; }

		[field: NonSerialized]
		public List<SoundReplacementCollection> ReplacementCollections { get; private set; } = new List<SoundReplacementCollection>();


		public ManualLogSource Logger
		{
			get
			{
				if (_logger == null)
				{
					_logger = Logger.CreateLogSource(GUID);
				}
				return _logger;
			}
		}

		[JsonConstructor]
		internal SoundPack()
		{
		}

		internal void Bind(ConfigFile file)
		{
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Invalid comparison between Unknown and I4
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Invalid comparison between Unknown and I4
			if (config == null || config.Count == 0)
			{
				return;
			}
			loaforcsSoundAPI.Logger.LogDebug((object)"handling config");
			JToken val2 = default(JToken);
			foreach (KeyValuePair<string, JObject> item in config)
			{
				string[] array = item.Key.Split(":");
				string text = array[0];
				string text2 = array[1];
				JToken val = item.Value["default"];
				string text3 = (item.Value.TryGetValue("description", ref val2) ? ((object)val2).ToString() : "no description defined!");
				JTokenType type = val.Type;
				if ((int)type != 8)
				{
					if ((int)type != 9)
					{
						throw new NotImplementedException("WHAT");
					}
					_configData[item.Key] = file.Bind<bool>(text, text2, (bool)val, text3).Value;
				}
				else
				{
					_configData[item.Key] = file.Bind<string>(text, text2, (string)val, text3).Value;
				}
			}
		}

		public SoundPack(string name, string packFolder)
		{
			Name = name;
			PackFolder = packFolder;
		}

		internal bool TryGetConfigValue(string id, out object returnValue)
		{
			returnValue = null;
			if (!_configData.TryGetValue(id, out var value))
			{
				return false;
			}
			returnValue = value;
			return true;
		}

		public List<IValidatable.ValidationResult> Validate()
		{
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Invalid comparison between Unknown and I4
			//IL_013c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Invalid comparison between Unknown and I4
			//IL_0154: Unknown result type (might be due to invalid IL or missing references)
			List<IValidatable.ValidationResult> list = new List<IValidatable.ValidationResult>();
			if (string.IsNullOrEmpty(Name))
			{
				list.Add(new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, "'name' can not be missing or empty!"));
				return list;
			}
			string name = Name;
			foreach (char c in name)
			{
				if (!char.IsLetter(c) && c != '_')
				{
					list.Add(new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, $"'name' can not contain special character '{c}'!"));
				}
			}
			if (string.IsNullOrEmpty(Version) && PackLoadingConfig.MetadataSpoofing)
			{
				list.Add(new IValidatable.ValidationResult(IValidatable.ResultType.WARN, "'version' should not be empty, defaulting to '1.0.0' (needed by MetadataSpoofing config)"));
			}
			if (config == null)
			{
				return list;
			}
			JToken val = default(JToken);
			foreach (KeyValuePair<string, JObject> item in config)
			{
				string[] array = item.Key.Split(":");
				if (array.Length != 2)
				{
					list.Add(new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, "'" + item.Key + "' is not a valid key for config! It must be 'section:name' with exactly one colon!"));
				}
				if (!item.Value.TryGetValue("default", ref val))
				{
					list.Add(new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, "'" + item.Key + "' does not have a 'default' value! This is needed to get what type the config is!"));
				}
				else if ((int)val.Type != 9 && (int)val.Type != 8)
				{
					list.Add(new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, $"'{item.Key}' is of unsupported type: '{val.Type}'! Only supported types are strings/text or booleans!"));
				}
				if (!item.Value.ContainsKey("description"))
				{
					list.Add(new IValidatable.ValidationResult(IValidatable.ResultType.WARN, "'" + item.Key + "' does not have a description."));
				}
			}
			return list;
		}
	}
	public class SoundReplacementCollection : Conditional, IFilePathAware, IPackData
	{
		[field: NonSerialized]
		public override SoundPack Pack { get; set; }

		public bool UpdateEveryFrame { get; private set; }

		public bool Synced { get; private set; }

		public List<SoundReplacementGroup> Replacements { get; private set; } = new List<SoundReplacementGroup>();


		public string FilePath { get; set; }

		[JsonConstructor]
		internal SoundReplacementCollection()
		{
		}

		public SoundReplacementCollection(SoundPack pack)
		{
			Pack = pack;
			pack.ReplacementCollections.Add(this);
		}

		internal void AddSoundReplacementGroup(SoundReplacementGroup group)
		{
			Replacements.Add(group);
		}
	}
	public class SoundReplacementGroup : Conditional
	{
		[field: NonSerialized]
		public SoundReplacementCollection Parent { get; internal set; }

		public List<string> Matches { get; private set; }

		public List<SoundInstance> Sounds { get; private set; } = new List<SoundInstance>();


		public override SoundPack Pack
		{
			get
			{
				return Parent.Pack;
			}
			set
			{
				if (Parent.Pack != null)
				{
					throw new InvalidOperationException("Pack has already been set.");
				}
				Parent.Pack = value;
			}
		}

		[JsonConstructor]
		internal SoundReplacementGroup()
		{
		}

		public SoundReplacementGroup(SoundReplacementCollection parent, List<string> matches)
		{
			Parent = parent;
			Matches = matches;
			if (SoundPackDataHandler.LoadedPacks.Contains(parent.Pack))
			{
				throw new InvalidOperationException("SoundPack has already been registered, trying to add a new SoundReplacementGroup does not work!");
			}
			parent.AddSoundReplacementGroup(this);
		}

		internal void AddSoundReplacement(SoundInstance sound)
		{
			Sounds.Add(sound);
		}

		public override List<IValidatable.ValidationResult> Validate()
		{
			List<IValidatable.ValidationResult> list = base.Validate();
			foreach (string match in Matches)
			{
				if (string.IsNullOrEmpty(match))
				{
					list.Add(new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, "Match string can not be empty!"));
					continue;
				}
				string[] array = match.Split(":");
				if (array.Length == 1)
				{
					list.Add(new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, "'" + match + "' is not valid! If you mean to match to all Audio clips with this name you must explicitly do '*:" + match + "'."));
				}
				if (array.Length > 3)
				{
					list.Add(new IValidatable.ValidationResult(IValidatable.ResultType.WARN, $"'{match}' has more than 3 parts! SoundAPI will handle this as '{match[0]}:{match[1]}:{match[2]}', discarding the rest!"));
				}
			}
			return list;
		}
	}
}
namespace loaforcsSoundAPI.SoundPacks.Data.Conditions
{
	public abstract class Condition : IValidatable
	{
		[field: NonSerialized]
		public Conditional Parent { get; internal set; }

		protected SoundPack Pack => Parent.Pack;

		public bool? Constant { get; private set; }

		protected internal virtual void OnRegistered()
		{
		}

		public abstract bool Evaluate(IContext context);

		public virtual List<IValidatable.ValidationResult> Validate()
		{
			return new List<IValidatable.ValidationResult>();
		}

		protected bool EvaluateRangeOperator(int number, string condition)
		{
			return EvaluateRangeOperator((double)number, condition);
		}

		protected bool EvaluateRangeOperator(float number, string condition)
		{
			return EvaluateRangeOperator((double)number, condition);
		}

		protected bool EvaluateRangeOperator(double value, string condition)
		{
			string[] array = condition.Split("..");
			if (array.Length == 1)
			{
				if (double.TryParse(array[0], out var result))
				{
					return value == result;
				}
				return false;
			}
			if (array.Length == 2)
			{
				double result2;
				if (array[0] == "")
				{
					result2 = double.MinValue;
				}
				else if (!double.TryParse(array[0], out result2))
				{
					return false;
				}
				double result3;
				if (array[1] == "")
				{
					result3 = double.MaxValue;
				}
				else if (!double.TryParse(array[1], out result3))
				{
					return false;
				}
				if (value >= result2)
				{
					return value <= result3;
				}
				return false;
			}
			return false;
		}

		protected bool ValidateRangeOperator(string condition, out IValidatable.ValidationResult result)
		{
			result = null;
			if (string.IsNullOrEmpty(condition))
			{
				result = new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, "Range operator can not be missing or empty!");
				return false;
			}
			string[] array = condition.Split("..");
			int num = array.Length;
			if (num <= 2)
			{
				switch (num)
				{
				case 1:
				{
					if (!double.TryParse(array[0], out var _))
					{
						result = new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, "Failed to parse: '" + array[0] + "' as a number!");
					}
					break;
				}
				case 2:
				{
					double num2;
					if (array[0] == "")
					{
						num2 = double.MinValue;
					}
					else if (!double.TryParse(array[0], out num2))
					{
						result = new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, "Failed to parse: '" + array[0] + "' as a number!");
					}
					double num3;
					if (array[1] == "")
					{
						num3 = double.MaxValue;
					}
					else if (!double.TryParse(array[1], out num3))
					{
						result = new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, "Failed to parse: '" + array[1] + "' as a number!");
					}
					break;
				}
				}
			}
			else
			{
				result = new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, "Range operator: '" + condition + "' uses .. more than once!");
			}
			return result == null;
		}

		protected static void LogDebug(string name, object message)
		{
			Debuggers.ConditionsInfo?.Log($"({name}) {message}");
		}
	}
	internal sealed class InvalidCondition : Condition
	{
		[CompilerGenerated]
		private string <type>P;

		public InvalidCondition(string type)
		{
			<type>P = type;
			base..ctor();
		}

		public override bool Evaluate(IContext context)
		{
			return false;
		}

		public override List<IValidatable.ValidationResult> Validate()
		{
			if (string.IsNullOrEmpty(<type>P))
			{
				return new List<IValidatable.ValidationResult>(1)
				{
					new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, "Condition must have a type!")
				};
			}
			return new List<IValidatable.ValidationResult>(1)
			{
				new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, "'" + <type>P + "' is not a valid condition type!")
			};
		}
	}
	internal sealed class ConstantCondition : Condition
	{
		public static ConstantCondition TRUE = new ConstantCondition(constant: true);

		public static ConstantCondition FALSE = new ConstantCondition(constant: false);

		public bool Value { get; private set; }

		private ConstantCondition(bool constant)
		{
			Value = constant;
		}

		public override bool Evaluate(IContext context)
		{
			return Value;
		}
	}
	public abstract class Condition<TContext> : Condition where TContext : IContext
	{
		public override bool Evaluate(IContext context)
		{
			if (!(context is TContext context2))
			{
				return EvaluateFallback(context);
			}
			return EvaluateWithContext(context2);
		}

		protected abstract bool EvaluateWithContext(TContext context);

		protected virtual bool EvaluateFallback(IContext context)
		{
			return false;
		}
	}
	public abstract class Conditional : IValidatable, IPackData
	{
		public Condition Condition { get; set; }

		public abstract SoundPack Pack { get; set; }

		public bool Evaluate(IContext context)
		{
			if (Condition == null)
			{
				return true;
			}
			return Condition.Evaluate(context);
		}

		public virtual List<IValidatable.ValidationResult> Validate()
		{
			if (Condition == null)
			{
				return new List<IValidatable.ValidationResult>();
			}
			Condition.Parent = this;
			Condition.OnRegistered();
			return Condition.Validate();
		}
	}
	public interface IContext
	{
	}
	internal class DefaultConditionContext : IContext
	{
		internal static readonly DefaultConditionContext DEFAULT = new DefaultConditionContext();

		private DefaultConditionContext()
		{
		}
	}
	[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
	[MeansImplicitUse]
	public class SoundAPIConditionAttribute : Attribute
	{
		public string ID { get; private set; }

		public bool IsDeprecated { get; private set; }

		public string DeprecationReason { get; private set; }

		public SoundAPIConditionAttribute(string id, bool deprecated = false, string deprecationReason = null)
		{
			ID = id;
			IsDeprecated = deprecated;
			DeprecationReason = deprecationReason;
			base..ctor();
		}
	}
}
namespace loaforcsSoundAPI.SoundPacks.Conditions
{
	public abstract class LogicGateCondition : Condition
	{
		public abstract Condition[] Conditions { get; protected set; }

		protected abstract string ValidateWarnMessage { get; }

		protected internal override void OnRegistered()
		{
			Condition[] conditions = Conditions;
			foreach (Condition condition in conditions)
			{
				condition.Parent = base.Parent;
				condition.OnRegistered();
			}
		}

		public override List<IValidatable.ValidationResult> Validate()
		{
			if (Conditions.Length == 0)
			{
				return new List<IValidatable.ValidationResult>(1)
				{
					new IValidatable.ValidationResult(IValidatable.ResultType.WARN, ValidateWarnMessage)
				};
			}
			return new List<IValidatable.ValidationResult>();
		}

		protected static bool And(Condition[] conditions, IContext context)
		{
			foreach (Condition condition in conditions)
			{
				if (condition is InvalidCondition)
				{
					return false;
				}
				if (!condition.Evaluate(context))
				{
					return false;
				}
			}
			return true;
		}

		protected static bool Or(Condition[] conditions, IContext context)
		{
			foreach (Condition condition in conditions)
			{
				if (condition is InvalidCondition)
				{
					return false;
				}
				if (condition.Evaluate(context))
				{
					return true;
				}
			}
			return false;
		}
	}
	[SoundAPICondition("and", false, null)]
	internal class AndCondition : LogicGateCondition
	{
		public override Condition[] Conditions { get; protected set; }

		protected override string ValidateWarnMessage => "'and' condition has no conditions and will always return true!";

		public override bool Evaluate(IContext context)
		{
			return LogicGateCondition.And(Conditions, context);
		}
	}
	[SoundAPICondition("nand", false, null)]
	internal class NandCondition : LogicGateCondition
	{
		public override Condition[] Conditions { get; protected set; }

		protected override string ValidateWarnMessage => "'nand' condition has no conditions and will always return false!";

		public override bool Evaluate(IContext context)
		{
			return !LogicGateCondition.And(Conditions, context);
		}
	}
	[SoundAPICondition("config", false, null)]
	internal class ConfigCondition : Condition
	{
		public string Config { get; private set; }

		public object Value { get; private set; }

		public override bool Evaluate(IContext context)
		{
			if (!base.Pack.TryGetConfigValue(Config, out var returnValue))
			{
				return false;
			}
			if (Value == null)
			{
				if (returnValue is bool)
				{
					return (bool)returnValue;
				}
				if (returnValue is string value)
				{
					return string.IsNullOrEmpty(value);
				}
				return false;
			}
			if (returnValue is bool flag)
			{
				return flag == (bool)Value;
			}
			if (returnValue is string text)
			{
				return text == (string)Value;
			}
			return false;
		}

		public override List<IValidatable.ValidationResult> Validate()
		{
			if (!base.Pack.TryGetConfigValue(Config, out var returnValue))
			{
				List<IValidatable.ValidationResult> list = new List<IValidatable.ValidationResult>(1);
				list.Add(new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, "Config '" + Config + "' does not exist on SoundPack '" + base.Pack.Name + "'"));
				return list;
			}
			if (Value != null && returnValue.GetType() != Value.GetType())
			{
				return new List<IValidatable.ValidationResult>(1)
				{
					new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, $"Config '{Config}' has a type of: '{returnValue.GetType()}' but the Value type is '{Value.GetType()}'!")
				};
			}
			return new List<IValidatable.ValidationResult>();
		}
	}
	[SoundAPICondition("counter", false, null)]
	public class CounterCondition : Condition
	{
		private int _count;

		public string Value { get; private set; }

		public int? ResetsAt { get; private set; }

		public override bool Evaluate(IContext context)
		{
			Condition.LogDebug("counter", $"counting: {_count} -> {_count + 1}");
			_count++;
			bool flag = EvaluateRangeOperator(_count, Value);
			Condition.LogDebug("counter", $"is {_count} in range ({Value})? {flag}");
			if (_count >= ResetsAt)
			{
				_count = 0;
				Condition.LogDebug("counter", "reset count to 0.");
			}
			return flag;
		}

		public override List<IValidatable.ValidationResult> Validate()
		{
			if (!ValidateRangeOperator(Value, out var result))
			{
				return new List<IValidatable.ValidationResult>(1) { result };
			}
			return new List<IValidatable.ValidationResult>();
		}
	}
	[SoundAPICondition("mod_installed", false, null)]
	internal class ModInstalledCondition : Condition
	{
		public string Value { get; private set; }

		public override bool Evaluate(IContext context)
		{
			return Chainloader.PluginInfos.ContainsKey(Value);
		}

		public override List<IValidatable.ValidationResult> Validate()
		{
			if (string.IsNullOrEmpty(Value))
			{
				return new List<IValidatable.ValidationResult>(1)
				{
					new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, "Value on 'mod_installed' must be there and must not be empty.")
				};
			}
			return new List<IValidatable.ValidationResult>();
		}
	}
	[SoundAPICondition("not", false, null)]
	internal class NotCondition : Condition
	{
		public Condition Condition { get; private set; }

		protected internal override void OnRegistered()
		{
			if (Condition != null)
			{
				Condition.Parent = base.Parent;
				Condition.OnRegistered();
			}
		}

		public override bool Evaluate(IContext context)
		{
			if (Condition is InvalidCondition)
			{
				return false;
			}
			return !Condition.Evaluate(context);
		}

		public override List<IValidatable.ValidationResult> Validate()
		{
			if (Condition == null)
			{
				return new List<IValidatable.ValidationResult>(1)
				{
					new IValidatable.ValidationResult(IValidatable.ResultType.FAIL, "'not' condition has no valid condition to invert!")
				};
			}
			return new List<IValidatable.ValidationResult>();
		}
	}
	[SoundAPICondition("or", false, null)]
	internal class OrCondition : LogicGateCondition
	{
		public override Condition[] Conditions { get; protected set; }

		protected override string ValidateWarnMessage => "'or' condition has no conditions and will always return false!";

		public override bool Evaluate(IContext context)
		{
			return LogicGateCondition.Or(Conditions, context);
		}
	}
	[SoundAPICondition("nor", false, null)]
	internal class NorCondition : LogicGateCondition
	{
		public override Condition[] Conditions { get; protected set; }

		protected override string ValidateWarnMessage => "'nor' condition has no conditions and will always return true!";

		public override bool Evaluate(IContext context)
		{
			return !LogicGateCondition.Or(Conditions, context);
		}
	}
}
namespace loaforcsSoundAPI.Reporting
{
	public static class SoundReportHandler
	{
		private const string _datetimeFormat = "dd_MM_yyyy-HH_mm";

		private static Action<StreamWriter, SoundReport> _reportSections = delegate
		{
		};

		public static SoundReport CurrentReport { get; private set; }

		public static void AddReportSection(string header, Action<StreamWriter, SoundReport> callback)
		{
			_reportSections = (Action<StreamWriter, SoundReport>)Delegate.Combine(_reportSections, (Action<StreamWriter, SoundReport>)delegate(StreamWriter stream, SoundReport report)
			{
				stream.WriteLine("## " + header);
				callback(stream, report);
				stream.WriteLine("");
				stream.WriteLine("");
			});
		}

		internal static void Register()
		{
			Directory.CreateDirectory(GetFolder());
			CurrentReport = new SoundReport();
			loaforcsSoundAPI.Logger.LogWarning((object)"SoundAPI is generating a report!");
			loaforcsSoundAPI.Logger.LogInfo((object)("The report will be located at '" + LogFormats.FormatFilePath(Path.Combine(GetFolder(), GetFileName(CurrentReport, ".md")))));
			Application.quitting += delegate
			{
				WriteReportToFile(CurrentReport);
			};
			SoundPackLoadPipeline.OnFinishedPipeline += delegate
			{
				foreach (SoundPack loadedPack in SoundPackDataHandler.LoadedPacks)
				{
					CurrentReport.SoundPackNames.Add(loadedPack.Name);
				}
			};
			AddReportSection("General Information", delegate(StreamWriter stream, SoundReport report)
			{
				stream.WriteLine("SoundAPI version: `2.0.8` <br/><br/>");
				stream.WriteLine($"Audio-clips loaded: `{report.AudioClipsLoaded}` <br/>");
				stream.WriteLine($"Match strings registered: `{SoundPackDataHandler.SoundReplacements.Values.Sum((List<SoundReplacementGroup> it) => it.Count)}` <br/>");
				WriteList("Loaded sound-packs", stream, report.SoundPackNames);
			});
			AddReportSection("Dynamic Data", delegate(StreamWriter stream, SoundReport _)
			{
				if (SoundAPI.CurrentNetworkAdapter != null)
				{
					stream.WriteLine("Network Adapter: `" + SoundAPI.CurrentNetworkAdapter.Name + "` <br/><br/>");
				}
				WriteList("Registered Conditions", stream, SoundPackDataHandler.conditionFactories.Keys.ToList());
			});
			AddReportSection("All Played Sounds", delegate(StreamWriter stream, SoundReport report)
			{
				WriteList(null, stream, report.PlayedSounds.Select((SoundReport.PlayedSound it) => it.FormatForReport()).ToList());
			});
		}

		internal static void Bind(ConfigFile file)
		{
			if (file.Bind<bool>("Developer", "GenerateReports", false, "While true SoundAPI will generate a json and markdown file per session that records information SoundAPI and related mods find.").Value)
			{
				Register();
			}
		}

		private static string GetFileName(SoundReport report, string extension)
		{
			return "generated_report-" + report.StartedAt.ToString("dd_MM_yyyy-HH_mm") + extension;
		}

		private static string GetFolder()
		{
			return Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "reports");
		}

		private static void WriteReportToFile(SoundReport report)
		{
			using StreamWriter streamWriter = new StreamWriter(Path.Combine(GetFolder(), GetFileName(report, ".md")));
			streamWriter.WriteLine("# Generated Report");
			streamWriter.WriteLine($"At {report.StartedAt} :3");
			streamWriter.WriteLine("");
			_reportSections(streamWriter, report);
			streamWriter.Flush();
			streamWriter.Close();
			using StreamWriter streamWriter2 = new StreamWriter(Path.Combine(GetFolder(), GetFileName(report, ".json")));
			streamWriter2.WriteLine(JsonConvert.SerializeObject((object)report, (Formatting)1));
		}

		public static void WriteList(string header, StreamWriter stream, ICollection<string> list)
		{
			if (!string.IsNullOrEmpty(header))
			{
				stream.WriteLine($"### {header} (`{list.Count}`)");
			}
			stream.WriteLine(string.Join("<br/>\n", list.Select((string it) => "- " + it)));
		}

		public static void WriteEnum<T>(string header, StreamWriter stream) where T : Enum
		{
			WriteList(header, stream, (from it in Enum.GetValues(typeof(T)).OfType<T>()
				select it.ToString().ToLowerInvariant()).ToList());
		}
	}
}
namespace loaforcsSoundAPI.Reporting.Data
{
	public class SoundReport
	{
		public class PlayedSound
		{
			public string MatchString { get; private set; }

			public string Caller { get; private set; }

			public bool IsPlayOnAwake { get; private set; }

			public PlayedSound(string matchString, string caller, bool isPlayOnAwake)
			{
				MatchString = matchString;
				Caller = caller;
				IsPlayOnAwake = isPlayOnAwake;
				base..ctor();
			}

			public override bool Equals(object obj)
			{
				if (!(obj is PlayedSound other))
				{
					return false;
				}
				return Equals(other);
			}

			protected bool Equals(PlayedSound other)
			{
				if (MatchString == other.MatchString && Caller == other.Caller)
				{
					return IsPlayOnAwake == other.IsPlayOnAwake;
				}
				return false;
			}

			public override int GetHashCode()
			{
				return HashCode.Combine(MatchString, Caller, IsPlayOnAwake);
			}

			public string FormatForReport()
			{
				return $"Match String: {MatchString}, Caller: {Caller}, IsPlayOnAwake: {IsPlayOnAwake}";
			}
		}

		public DateTime StartedAt { get; private set; } = DateTime.Now;


		public List<PlayedSound> PlayedSounds { get; private set; } = new List<PlayedSound>();


		public List<string> SoundPackNames { get; private set; } = new List<string>();


		public int AudioClipsLoaded { get; set; }
	}
}
namespace loaforcsSoundAPI.Core
{
	public class AudioSourceAdditionalData
	{
		private SoundReplacementGroup _replacedWith;

		public AudioSource Source { get; private set; }

		public AudioClip OriginalClip { get; internal set; }

		public AudioClip RealClip
		{
			get
			{
				using (new SpoofBypassContext())
				{
					if (Debuggers.AudioSourceAdditionalData != null)
					{
						string text = "null";
						if (Object.op_Implicit((Object)(object)Source.clip))
						{
							text = ((Object)Source.clip).name;
						}
						string text2 = "null";
						if (Object.op_Implicit((Object)(object)OriginalClip))
						{
							text2 = ((Object)OriginalClip).name;
						}
						Debuggers.AudioSourceAdditionalData.Log("(" + ((Object)Source).name + ") Getting real clip: " + text + " (original clip: " + text2 + ")");
					}
					return Source.clip;
				}
			}
			set
			{
				using (new SpoofBypassContext())
				{
					if (Debuggers.AudioSourceAdditionalData != null)
					{
						string text = "null";
						if (Object.op_Implicit((Object)(object)OriginalClip))
						{
							text = ((Object)OriginalClip).name;
						}
						Debuggers.AudioSourceAdditionalData?.Log("(" + ((Object)Source).name + ") Setting real clip: " + ((Object)value).name + " (original clip: " + text + ")");
					}
					Source.clip = value;
				}
			}
		}

		internal SoundReplacementGroup ReplacedWith
		{
			get
			{
				return _replacedWith;
			}
			set
			{
				_replacedWith = value;
				if (RequiresUpdateFunction())
				{
					if (!SoundAPIAudioManager.liveAudioSourceData.Contains(this))
					{
						SoundAPIAudioManager.liveAudioSourceData.Add(this);
					}
				}
				else if (SoundAPIAudioManager.liveAudioSourceData.Contains(this))
				{
					SoundAPIAudioManager.liveAudioSourceData.Remove(this);
				}
			}
		}

		public bool DisableReplacing { get; private set; }

		public IContext CurrentContext { get; set; }

		internal AudioSourceAdditionalData(AudioSource source)
		{
			Source = source;
		}

		internal void Update()
		{
			if (RequiresUpdateFunction() && AudioSourceIsPlaying())
			{
				Debuggers.UpdateEveryFrame?.Log("success: updating every frame for " + ((Object)Source).name);
				IContext context = CurrentContext ?? DefaultConditionContext.DEFAULT;
				SoundInstance soundInstance = ReplacedWith.Sounds.FirstOrDefault((SoundInstance x) => x.Evaluate(context));
				if (soundInstance != null && !((Object)(object)soundInstance.Clip == (Object)(object)Source.clip))
				{
					Debuggers.UpdateEveryFrame?.Log("new clip found, swapping!!");
					float time = Source.time;
					Source.clip = soundInstance.Clip;
					Source.Play();
					Source.time = time;
					Debuggers.UpdateEveryFrame?.Log("new clip found, swapped");
				}
			}
		}

		private bool RequiresUpdateFunction()
		{
			if (ReplacedWith != null)
			{
				return ReplacedWith.Parent.UpdateEveryFrame;
			}
			return false;
		}

		private bool AudioSourceIsPlaying()
		{
			if (Object.op_Implicit((Object)(object)Source) && ((Behaviour)Source).enabled)
			{
				return Source.isPlaying;
			}
			return false;
		}

		public static AudioSourceAdditionalData GetOrCreate(AudioSource source)
		{
			if (SoundAPIAudioManager.audioSourceData.TryGetValue(source, out var value))
			{
				return value;
			}
			value = new AudioSourceAdditionalData(source);
			value.OriginalClip = value.RealClip;
			SoundAPIAudioManager.audioSourceData[source] = value;
			return value;
		}
	}
	internal static class Debuggers
	{
		internal static DebugLogSource AudioSourceAdditionalData;

		internal static DebugLogSource SoundReplacementLoader;

		internal static DebugLogSource SoundReplacementHandler;

		internal static DebugLogSource MatchStrings;

		internal static DebugLogSource ConditionsInfo;

		internal static DebugLogSource UpdateEveryFrame;

		internal static DebugLogSource AudioClipSpoofing;

		internal static void Bind(ConfigFile file)
		{
			FieldInfo[] fields = typeof(Debuggers).GetFields(BindingFlags.Static | BindingFlags.NonPublic);
			foreach (FieldInfo fieldInfo in fields)
			{
				if (file.Bind<bool>("InternalDebugging", fieldInfo.Name, false, "Enable/Disable this DebugLogSource. Should only be true if you know what you are doing or have been asked to.").Value)
				{
					fieldInfo.SetValue(null, new DebugLogSource(fieldInfo.Name));
					loaforcsSoundAPI.Logger.LogDebug((object)("created a DebugLogSource for " + fieldInfo.Name + "!"));
				}
				else
				{
					fieldInfo.SetValue(null, null);
					loaforcsSoundAPI.Logger.LogDebug((object)("no DebugLogSource for " + fieldInfo.Name + "."));
				}
			}
		}
	}
	internal class DebugLogSource
	{
		[CompilerGenerated]
		private string <title>P;

		public DebugLogSource(string title)
		{
			<title>P = title;
			base..ctor();
		}

		internal void Log(object message)
		{
			loaforcsSoundAPI.Logger.LogDebug((object)$"[Debug-{<title>P}] {message}");
		}
	}
	internal class SoundAPIAudioManager : MonoBehaviour
	{
		internal static readonly Dictionary<AudioSource, AudioSourceAdditionalData> audioSourceData = new Dictionary<AudioSource, AudioSourceAdditionalData>();

		internal static readonly List<AudioSourceAdditionalData> liveAudioSourceData = new List<AudioSourceAdditionalData>();

		private static SoundAPIAudioManager Instance;

		private void Awake()
		{
			SceneManager.sceneLoaded += delegate
			{
				if (!Object.op_Implicit((Object)(object)Instance))
				{
					SpawnManager();
				}
				RunCleanup();
			};
		}

		internal static void SpawnManager()
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Expected O, but got Unknown
			loaforcsSoundAPI.Logger.LogInfo((object)"Starting AudioManager.");
			GameObject val = new GameObject("SoundAPI_AudioManager");
			Object.DontDestroyOnLoad((Object)(object)val);
			Instance = val.AddComponent<SoundAPIAudioManager>();
		}

		private void Update()
		{
			Debuggers.UpdateEveryFrame?.Log("sanity check: soundapi audio manager is running!");
			foreach (AudioSourceAdditionalData liveAudioSourceDatum in liveAudioSourceData)
			{
				liveAudioSourceDatum.Update();
			}
		}

		private void OnDisable()
		{
			loaforcsSoundAPI.Logger.LogDebug((object)"manager disabled");
		}

		private void OnDestroy()
		{
			loaforcsSoundAPI.Logger.LogDebug((object)"manager destroyed");
		}

		private static void RunCleanup()
		{
			loaforcsSoundAPI.Logger.LogDebug((object)"cleaning up old audio source entries");
			AudioSource[] array = audioSourceData.Keys.ToArray();
			foreach (AudioSource val in array)
			{
				if (!Object.op_Implicit((Object)(object)val))
				{
					if (liveAudioSourceData.Contains(audioSourceData[val]))
					{
						liveAudioSourceData.Remove(audioSourceData[val]);
					}
					audioSourceData.Remove(val);
				}
			}
		}
	}
	internal class SpoofBypassContext : IDisposable
	{
		public SpoofBypassContext()
		{
			AudioSourcePatch.bypassSpoofing = true;
		}

		public void Dispose()
		{
			AudioSourcePatch.bypassSpoofing = false;
		}
	}
}
namespace loaforcsSoundAPI.Core.Util
{
	public class AdaptiveConfigEntry
	{
		public AdaptiveBool State { get; private set; }

		public bool DefaultValue { get; private set; }

		public bool? OverrideValue { get; set; }

		public bool Value => State switch
		{
			AdaptiveBool.Enabled => true, 
			AdaptiveBool.Disabled => false, 
			_ => OverrideValue ?? DefaultValue, 
		};

		public AdaptiveConfigEntry(AdaptiveBool state, bool defaultValue)
		{
			State = state;
			DefaultValue = defaultValue;
		}
	}
	public enum AdaptiveBool
	{
		Automatic,
		Enabled,
		Disabled
	}
	internal static class LogFormats
	{
		internal static string FormatFilePath(string path)
		{
			return $"plugins{Path.DirectorySeparatorChar}{Path.Combine(Path.GetRelativePath(Paths.PluginPath, path))}";
		}
	}
}
namespace loaforcsSoundAPI.Core.Util.Extensions
{
	internal static class AssemblyExtensions
	{
		internal static IEnumerable<Type> GetLoadableTypes(this Assembly assembly)
		{
			if (assembly == null)
			{
				throw new ArgumentNullException("assembly");
			}
			try
			{
				return assembly.GetTypes();
			}
			catch (ReflectionTypeLoadException ex)
			{
				return ex.Types.Where((Type t) => t != null);
			}
		}
	}
	public static class AsyncOperationExtensions
	{
		public static TaskAwaiter GetAwaiter(this AsyncOperation asyncOp)
		{
			TaskCompletionSource<AsyncOperation> tcs = new TaskCompletionSource<AsyncOperation>();
			asyncOp.completed += delegate(AsyncOperation operation)
			{
				tcs.SetResult(operation);
			};
			return ((Task)tcs.Task).GetAwaiter();
		}
	}
	public static class ConfigFileExtensions
	{
		public static AdaptiveConfigEntry BindAdaptive(this ConfigFile file, string section, string key, bool defaultValue, string description)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			AdaptiveBool value = file.Bind<AdaptiveBool>(section, key, AdaptiveBool.Automatic, new ConfigDescription($"{description}\nAutomatic default: {defaultValue}", (AcceptableValueBase)null, Array.Empty<object>())).Value;
			return new AdaptiveConfigEntry(value, defaultValue);
		}
	}
	public static class ListExtensions
	{
		public static void AddUnique<T>(this List<T> list, T item)
		{
			if (!list.Contains(item))
			{
				list.Add(item);
			}
		}
	}
}
namespace loaforcsSoundAPI.Core.Patches
{
	[HarmonyPatch(typeof(AudioSource))]
	internal static class AudioSourcePatch
	{
		internal static bool bypassSpoofing;

		[HarmonyPrefix]
		[HarmonyPatch("Play", new Type[] { })]
		[HarmonyPatch("Play", new Type[] { typeof(ulong) })]
		[HarmonyPatch("Play", new Type[] { typeof(double) })]
		private static bool Play(AudioSource __instance)
		{
			AudioSourceAdditionalData orCreate = AudioSourceAdditionalData.GetOrCreate(__instance);
			if (SoundReplacementHandler.TryReplaceAudio(__instance, orCreate.OriginalClip, out var replacement))
			{
				if ((Object)(object)replacement == (Object)null)
				{
					return false;
				}
				orCreate.RealClip = replacement;
			}
			return true;
		}

		[HarmonyPrefix]
		[HarmonyPatch("PlayOneShot", new Type[]
		{
			typeof(AudioClip),
			typeof(float)
		})]
		private static bool PlayOneShot(AudioSource __instance, ref AudioClip clip)
		{
			if (SoundReplacementHandler.TryReplaceAudio(__instance, clip, out var replacement))
			{
				if ((Object)(object)replacement == (Object)null)
				{
					return false;
				}
				clip = replacement;
			}
			return true;
		}

		[HarmonyPatch(/*Could not decode attribute arguments.*/)]
		[HarmonyPriority(0)]
		[HarmonyPrefix]
		private static void UpdateOriginalClip(AudioSource __instance, AudioClip value, bool __runOriginal)
		{
			if (__runOriginal)
			{
				AudioSourceAdditionalData orCreate = AudioSourceAdditionalData.GetOrCreate(__instance);
				orCreate.OriginalClip = value;
				Debuggers.AudioClipSpoofing?.Log("(" + ((Object)((Component)__instance).gameObject).name + ") updating original clip to: " + ((Object)value).name);
			}
		}

		[HarmonyPatch(/*Could not decode attribute arguments.*/)]
		[HarmonyPrefix]
		private static bool PreventClipRestartingWithSpoofed(AudioSource __instance, AudioClip value)
		{
			if (!PatchConfig.AudioClipSpoofing || bypassSpoofing)
			{
				return true;
			}
			AudioSourceAdditionalData orCreate = AudioSourceAdditionalData.GetOrCreate(__instance);
			if ((Object)(object)orCreate.OriginalClip == (Object)(object)value)
			{
				Debuggers.AudioClipSpoofing?.Log("prevented clip from restarting");
			}
			return (Object)(object)orCreate.OriginalClip != (Object)(object)value;
		}

		[HarmonyPatch(/*Could not decode attribute arguments.*/)]
		[HarmonyPostfix]
		private static void SpoofAudioSourceClip(AudioSource __instance, ref AudioClip __result)
		{
			if (PatchConfig.AudioClipSpoofing && !bypassSpoofing)
			{
				AudioSourceAdditionalData orCreate = AudioSourceAdditionalData.GetOrCreate(__instance);
				__result = orCreate.OriginalClip;
				Debuggers.AudioClipSpoofing?.Log("(" + ((Object)((Component)__instance).gameObject).name + ") spoofing result to " + ((Object)orCreate.OriginalClip).name);
			}
		}
	}
	[HarmonyPatch(typeof(GameObject))]
	internal static class GameObjectPatch
	{
		[HarmonyPostfix]
		[HarmonyPatch("AddComponent", new Type[] { typeof(Type) })]
		internal static void NewAudioSource(GameObject __instance, ref Component __result)
		{
			Component obj = __result;
			AudioSource val = (AudioSource)(object)((obj is AudioSource) ? obj : null);
			if (val != null)
			{
				AudioSourceAdditionalData.GetOrCreate(val);
			}
		}
	}
	[HarmonyPatch(typeof(Logger))]
	internal static class LoggerPatch
	{
		[HarmonyPrefix]
		[HarmonyPatch("LogMessage")]
		private static void ReenableAndSaveConfigs(object data)
		{
			if (data is string text && text == "Chainloader startup complete")
			{
				loaforcsSoundAPI.Logger.LogInfo((object)"Starting Sound-pack loading pipeline");
				SoundPackLoadPipeline.StartPipeline();
			}
		}
	}
	internal static class PatchConfig
	{
		internal static bool AudioClipSpoofing { get; private set; }

		internal static void Bind(ConfigFile file)
		{
			AudioClipSpoofing = file.Bind<bool>("Experiments", "AudioClipSpoofing", false, "Should SoundAPI spoof the return value of AudioSource.clip? This can improve compatibility but is also fairly invasive.").Value;
		}
	}
	internal static class UnityObjectPatch
	{
		private static void InstantiatePatch(Object __result)
		{
			Debuggers.AudioSourceAdditionalData?.Log("aghuobr: " + __result.name);
			GameObject val = (GameObject)(object)((__result is GameObject) ? __result : null);
			if (val != null)
			{
				CheckInstantiationRecursively(val);
			}
		}

		internal static void Init(Harmony harmony)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Expected O, but got Unknown
			HarmonyMethod val = new HarmonyMethod(typeof(UnityObjectPatch).GetMethod("InstantiatePatch", BindingFlags.Static | BindingFlags.NonPublic));
			MethodInfo[] methods = typeof(Object).GetMethods();
			foreach (MethodInfo methodInfo in methods)
			{
				if (!(methodInfo.Name != "Instantiate"))
				{
					Debuggers.AudioSourceAdditionalData?.Log($"patching {methodInfo}");
					if (methodInfo.IsGenericMethod)
					{
						harmony.Patch((MethodBase)methodInfo.MakeGenericMethod(typeof(Object)), (HarmonyMethod)null, val, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
					}
					else
					{
						harmony.Patch((MethodBase)methodInfo, (HarmonyMethod)null, val, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
					}
				}
			}
		}

		private static void CheckInstantiationRecursively(GameObject gameObject)
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Expected O, but got Unknown
			AudioSourceAdditionalData audioSourceAdditionalData = default(AudioSourceAdditionalData);
			if (gameObject.TryGetComponent<AudioSourceAdditionalData>(ref audioSourceAdditionalData))
			{
				return;
			}
			AudioSource[] components = gameObject.GetComponents<AudioSource>();
			foreach (AudioSource source in components)
			{
				SoundReplacementHandler.CheckAudioSource(source);
			}
			foreach (Transform item in gameObject.transform)
			{
				Transform val = item;
				CheckInstantiationRecursively(((Component)val).gameObject);
			}
		}
	}
}
namespace loaforcsSoundAPI.Core.Networking
{
	public abstract class NetworkAdapter
	{
		public abstract string Name { get; }

		public abstract void OnRegister();
	}
}
namespace loaforcsSoundAPI.Core.JSON
{
	public static class JSONDataLoader
	{
		private class MatchesJSONConverter : JsonConverter
		{
			public override bool CanConvert(Type objectType)
			{
				return objectType == typeof(List<string>);
			}

			public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
			{
				//IL_0008: Unknown result type (might be due to invalid IL or missing references)
				//IL_000e: Invalid comparison between Unknown and I4
				JToken val = JToken.Load(reader);
				if ((int)val.Type == 2)
				{
					return val.ToObject<List<string>>();
				}
				return new List<string> { ((object)val).ToString() };
			}

			public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
			{
				serializer.Serialize(writer, value);
			}
		}

		private class IncludePrivatePropertiesContractResolver : DefaultContractResolver
		{
			internal IncludePrivatePropertiesContractResolver()
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				//IL_0011: Expected O, but got Unknown
				((DefaultContractResolver)this).NamingStrategy = (NamingStrategy)new SnakeCaseNamingStrategy();
			}

			protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				JsonProperty val = ((DefaultContractResolver)this).CreateProperty(member, memberSerialization);
				if (!val.Writable && member is PropertyInfo propertyInfo)
				{
					val.Writable = propertyInfo.GetSetMethod(nonPublic: true) != null;
				}
				return val;
			}
		}

		private class ConditionConverter : JsonConverter<Condition>
		{
			public override Condition ReadJson(JsonReader reader, Type objectType, Condition existingValue, bool hasExistingValue, JsonSerializer serializer)
			{
				JObject val = JObject.Load(reader);
				string text = ((object)val["type"])?.ToString();
				if (string.IsNullOrEmpty(text))
				{
					return new InvalidCondition(null);
				}
				Condition condition = SoundPackDataHandler.CreateCondition(text);
				if (condition == null)
				{
					return null;
				}
				serializer.Populate(((JToken)val).CreateReader(), (object)condition);
				if (condition.Constant == true)
				{
					if (!condition.Evaluate(DefaultConditionContext.DEFAULT))
					{
						return ConstantCondition.FALSE;
					}
					return ConstantCondition.TRUE;
				}
				return condition;
			}

			public override void WriteJson(JsonWriter writer, Condition value, JsonSerializer serializer)
			{
				throw new NotImplementedException("no.");
			}
		}

		private static readonly JsonSerializerSettings _settings = new JsonSerializerSettings
		{
			ContractResolver = (IContractResolver)(object)new IncludePrivatePropertiesContractResolver(),
			Converters = new List<JsonConverter>(2)
			{
				(JsonConverter)(object)new MatchesJSONConverter(),
				(JsonConverter)(object)new ConditionConverter()
			}
		};

		public static T LoadFromFile<T>(string path)
		{
			//IL_0061: Expected O, but got Unknown
			string text = File.ReadAllText(path);
			try
			{
				T val = JsonConvert.DeserializeObject<T>(text, _settings);
				if ((object)val is IFilePathAware filePathAware)
				{
					filePathAware.FilePath = path;
				}
				if ((object)val is Conditional conditional && conditional.Condition != null)
				{
					conditional.Condition.Parent = conditional;
					conditional.Condition.OnRegistered();
				}
				return val;
			}
			catch (JsonReaderException val2)
			{
				JsonReaderException val3 = val2;
				loaforcsSoundAPI.Logger.LogError((object)$"Failed to read json file: 'plugins{Path.DirectorySeparatorChar}{Path.GetRelativePath(Paths.PluginPath, path)}'");
				loaforcsSoundAPI.Logger.LogError((object)((Exception)(object)val3).Message);
				string[] array = text.Split("\n");
				int num = int.MaxValue;
				for (int i = Mathf.Max(0, val3.LineNumber - 3); i < Mathf.Min(array.Length, val3.LineNumber + 3); i++)
				{
					int num2 = array[i].TakeWhile(char.IsWhiteSpace).Count();
					num = Mathf.Min(num, num2);
				}
				for (int j = Mathf.Max(0, val3.LineNumber - 3); j < Mathf.Min(array.Length, val3.LineNumber + 3); j++)
				{
					string text2 = $"{(j + 1).ToString(),-5}|  ";
					string text3 = array[j];
					int num3 = Mathf.Min(array[j].Length, num);
					string text4 = text2 + text3.Substring(num3, text3.Length - num3).TrimEnd();
					if (j + 1 == val3.LineNumber)
					{
						text4 += " // <- HERE";
					}
					loaforcsSoundAPI.Logger.LogError((object)text4);
				}
			}
			return default(T);
		}
	}
}
namespace loaforcsSoundAPI.Core.Data
{
	public interface IFilePathAware
	{
		string FilePath { get; internal set; }
	}
	public interface IValidatable
	{
		public enum ResultType
		{
			WARN,
			FAIL
		}

		public class ValidationResult
		{
			public ResultType Status { get; private set; }

			public string Reason { get; private set; }

			public ValidationResult(ResultType resultType, string reason = null)
			{
				Status = resultType;
				Reason = reason ?? string.Empty;
				base..ctor();
			}
		}

		private static readonly StringBuilder _stringBuilder = new StringBuilder();

		List<ValidationResult> Validate();

		internal static bool LogAndCheckValidationResult(string context, List<ValidationResult> results, ManualLogSource logger)
		{
			if (results.Count == 0)
			{
				return true;
			}
			int num = 0;
			int num2 = 0;
			foreach (ValidationResult result in results)
			{
				switch (result.Status)
				{
				case ResultType.WARN:
					num++;
					break;
				case ResultType.FAIL:
					num2++;
					break;
				default:
					throw new ArgumentOutOfRangeException();
				}
			}
			_stringBuilder.Clear();
			if (num2 != 0)
			{
				_stringBuilder.Append(num2);
				_stringBuilder.Append(" fail(s)");
			}
			if (num != 0)
			{
				if (num2 != 0)
				{
					_stringBuilder.Append(" and ");
				}
				_stringBuilder.Append(num);
				_stringBuilder.Append(" warning(s)");
			}
			_stringBuilder.Append(" while ");
			_stringBuilder.Append(context);
			_stringBuilder.Append(": ");
			if (num2 != 0)
			{
				logger.LogError((object)_stringBuilder);
			}
			else
			{
				logger.LogWarning((object)_stringBuilder);
			}
			foreach (ValidationResult result2 in results)
			{
				switch (result2.Status)
				{
				case ResultType.WARN:
					logger.LogWarning((object)("WARN: " + result2.Reason));
					break;
				case ResultType.FAIL:
					logger.LogError((object)("FAIL: " + result2.Reason));
					break;
				default:
					throw new ArgumentOutOfRangeException();
				}
			}
			return num2 == 0;
		}
	}
}

plugins/me.loaforc.soundapi.repo.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("me.loaforc.soundapi.repo")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.1.0")]
[assembly: AssemblyInformationalVersion("1.0.1+48466f205a331bbfbabb327827601bfd154e03d3")]
[assembly: AssemblyProduct("loaforcsSoundAPI.REPO")]
[assembly: AssemblyTitle("me.loaforc.soundapi.repo")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.1.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace loaforcsSoundAPI.REPO
{
	[BepInPlugin("me.loaforc.soundapi.repo", "loaforcsSoundAPI.REPO", "1.0.1")]
	public class SoundAPIREPO : BaseUnityPlugin
	{
		public static SoundAPIREPO Instance { get; private set; }

		internal static ManualLogSource Logger { get; private set; }

		private void Awake()
		{
			Logger = Logger.CreateLogSource("me.loaforc.soundapi.repo");
			Instance = this;
			Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "me.loaforc.soundapi.repo");
			Logger.LogInfo((object)"me.loaforc.soundapi.repo has loaded :3");
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "me.loaforc.soundapi.repo";

		public const string PLUGIN_NAME = "loaforcsSoundAPI.REPO";

		public const string PLUGIN_VERSION = "1.0.1";
	}
}
namespace loaforcsSoundAPI.REPO.Patches
{
	[HarmonyPatch(typeof(Sound))]
	internal static class SoundPatch
	{
		[HarmonyTranspiler]
		[HarmonyPatch("PlayLoop")]
		private static IEnumerable<CodeInstruction> FixLoopingSounds(IEnumerable<CodeInstruction> instructions)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Expected O, but got Unknown
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Expected O, but got Unknown
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Expected O, but got Unknown
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Expected O, but got Unknown
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Expected O, but got Unknown
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Expected O, but got Unknown
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Expected O, but got Unknown
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Expected O, but got Unknown
			return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(true, (CodeMatch[])(object)new CodeMatch[5]
			{
				new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(Sound), "Source"), (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(Sound), "LoopClip"), (string)null),
				new CodeMatch((OpCode?)OpCodes.Callvirt, (object)AccessTools.PropertySetter(typeof(AudioSource), "clip"), (string)null)
			}).Insert((CodeInstruction[])(object)new CodeInstruction[3]
			{
				new CodeInstruction(OpCodes.Ldarg_0, (object)null),
				new CodeInstruction(OpCodes.Ldc_I4_1, (object)null),
				new CodeInstruction(OpCodes.Stfld, (object)AccessTools.Field(typeof(Sound), "AudioInfoFetched"))
			}).InstructionEnumeration();
		}

		[HarmonyPrefix]
		[HarmonyPatch("PlayLoop")]
		private static void ResetAudioInfoFetched(Sound __instance)
		{
			if (!Object.op_Implicit((Object)(object)__instance.Source.clip))
			{
				__instance.AudioInfoFetched = false;
			}
		}
	}
}

plugins/MenuLib.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using MenuLib.MonoBehaviors;
using MenuLib.Structs;
using Microsoft.CodeAnalysis;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using MonoMod.RuntimeDetour;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("MenuLib")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("2.5.0")]
[assembly: AssemblyInformationalVersion("1.0.0+8820610107414251d3ab8ae6253536a4dd3fa7c9")]
[assembly: AssemblyProduct("MenuLib")]
[assembly: AssemblyTitle("MenuLib")]
[assembly: AssemblyVersion("2.5.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace MenuLib
{
	[BepInPlugin("nickklmao.menulib", "Menu Lib", "2.5.0")]
	internal sealed class Entry : BaseUnityPlugin
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static Action<Action<MenuPageMain>, MenuPageMain> <0>__MenuPageMain_StartHook;

			public static Action<Action<MenuPageSettings>, MenuPageSettings> <1>__MenuPageSettings_StartHook;

			public static Action<Action<MenuPageColor>, MenuPageColor> <2>__MenuPageColor_StartHook;

			public static Action<Action<MenuPageEsc>, MenuPageEsc> <3>__MenuPageEsc_StartHook;

			public static Action<Action<MenuPageRegions>, MenuPageRegions> <4>__MenuPageRegions_StartHook;

			public static Action<Action<MenuPageServerList>, MenuPageServerList> <5>__MenuPageServerList_StartHook;

			public static Action<Action<MenuPageLobby>, MenuPageLobby> <6>__MenuPageLobby_StartHook;

			public static Manipulator <7>__SemiFunc_UIMouseHoverILHook;

			public static Manipulator <8>__MenuPage_StateClosingILHook;

			public static Manipulator <9>__MenuScrollBox_UpdateILHook;

			public static Manipulator <10>__ChatManager_StateInactiveILHook;
		}

		private const string MOD_NAME = "Menu Lib";

		internal static readonly ManualLogSource logger = Logger.CreateLogSource("Menu Lib");

		private static void MenuPageMain_StartHook(Action<MenuPageMain> orig, MenuPageMain self)
		{
			orig(self);
			MenuAPI.mainMenuBuilderDelegate?.Invoke(((Component)self).transform);
		}

		private static void MenuPageSettings_StartHook(Action<MenuPageSettings> orig, MenuPageSettings self)
		{
			orig(self);
			MenuAPI.settingsMenuBuilderDelegate?.Invoke(((Component)self).transform);
		}

		private static void MenuPageColor_StartHook(Action<MenuPageColor> orig, MenuPageColor self)
		{
			orig(self);
			MenuAPI.colorMenuBuilderDelegate?.Invoke(((Component)self).transform);
		}

		private static void MenuPageEsc_StartHook(Action<MenuPageEsc> orig, MenuPageEsc self)
		{
			orig(self);
			MenuAPI.escapeMenuBuilderDelegate?.Invoke(((Component)self).transform);
		}

		private static void MenuPageRegions_StartHook(Action<MenuPageRegions> orig, MenuPageRegions self)
		{
			orig(self);
			MenuAPI.regionSelectionMenuBuilderDelegate?.Invoke(((Component)self).transform);
		}

		private static void MenuPageServerList_StartHook(Action<MenuPageServerList> orig, MenuPageServerList self)
		{
			orig(self);
			MenuAPI.serverListMenuBuilderDelegate?.Invoke(((Component)self).transform);
		}

		private static void MenuPageLobby_StartHook(Action<MenuPageLobby> orig, MenuPageLobby self)
		{
			orig(self);
			MenuAPI.lobbyMenuBuilderDelegate?.Invoke(((Component)self).transform);
		}

		private static void SemiFunc_UIMouseHoverILHook(ILContext il)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			ILLabel val4 = default(ILLabel);
			val.GotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction instruction) => ILPatternMatchingExt.MatchBrfalse(instruction, ref val4) && val4.Target.OpCode == OpCodes.Ldarg_1
			});
			val.Index += 2;
			val.RemoveRange(27);
			val.Emit(OpCodes.Ldloc_0);
			val.EmitDelegate<Func<MenuScrollBox, Vector2, bool>>((Func<MenuScrollBox, Vector2, bool>)delegate(MenuScrollBox menuScrollBox, Vector2 vector)
			{
				//IL_000b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0011: Expected O, but got Unknown
				//IL_0012: 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_002b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0034: Unknown result type (might be due to invalid IL or missing references)
				RectTransform val3 = (RectTransform)((Transform)menuScrollBox.scroller).parent;
				float y = ((Transform)val3).position.y;
				float num = y + val3.sizeDelta.y;
				return vector.y > y && vector.y < num;
			});
			ILLabel val2 = val.DefineLabel();
			val.Emit(OpCodes.Brtrue_S, (object)val2);
			val.Emit(OpCodes.Ldc_I4_0);
			val.Emit(OpCodes.Ret);
			val.MarkLabel(val2);
		}

		private static void MenuPage_StateClosingILHook(ILContext il)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			val.GotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction instruction) => ILPatternMatchingExt.MatchLdfld<MenuPage>(instruction, "stateStart")
			});
			val.Index += 2;
			val.Emit(OpCodes.Ldarg_0);
			val.EmitDelegate<Action<MenuPage>>((Action<MenuPage>)delegate(MenuPage menuPage)
			{
				//IL_0016: Unknown result type (might be due to invalid IL or missing references)
				//IL_001c: Expected O, but got Unknown
				//IL_001d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				//IL_002b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0030: Unknown result type (might be due to invalid IL or missing references)
				//IL_003f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0044: Unknown result type (might be due to invalid IL or missing references)
				//IL_0058: Unknown result type (might be due to invalid IL or missing references)
				if (MenuAPI.customMenuPages.TryGetValue(menuPage, out var value2))
				{
					RectTransform val2 = (RectTransform)((Component)menuPage).transform;
					Vector2 val3 = Vector2.op_Implicit(((Transform)val2).position);
					Rect rect = val2.rect;
					float num = 0f - ((Rect)(ref rect)).height;
					rect = value2.rectTransform.rect;
					val3.y = num - ((Rect)(ref rect)).height;
					REPOReflection.menuPage_AnimateAwayPosition.SetValue(menuPage, val3);
				}
			});
			val.GotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction instruction) => ILPatternMatchingExt.MatchCall<Object>(instruction, "Destroy")
			});
			val.Index -= 5;
			val.RemoveRange(6);
			val.Emit(OpCodes.Ldarg_0);
			val.EmitDelegate<Action<MenuPage>>((Action<MenuPage>)delegate(MenuPage menuPage)
			{
				if (MenuAPI.customMenuPages.TryGetValue(menuPage, out var value) && (value.isCachedPage || !value.pageWasActivatedOnce))
				{
					((Behaviour)menuPage).enabled = false;
				}
				else
				{
					MenuManager.instance.PageRemove(menuPage);
					Object.Destroy((Object)(object)((Component)menuPage).gameObject);
				}
			});
		}

		private static void MenuScrollBox_UpdateILHook(ILContext il)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0219: Unknown result type (might be due to invalid IL or missing references)
			//IL_025e: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			val.GotoNext(new Func<Instruction, bool>[2]
			{
				(Instruction instruction) => ILPatternMatchingExt.MatchLdarg(instruction, 0),
				(Instruction instruction) => ILPatternMatchingExt.MatchLdfld<MenuScrollBox>(instruction, "scrollBoxActive")
			});
			val.RemoveRange(4);
			ILLabel val2 = val.MarkLabel();
			val.Index -= 2;
			val.Remove();
			val.Emit(OpCodes.Brtrue_S, (object)val2);
			val.GotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction instruction) => ILPatternMatchingExt.MatchCall(instruction, typeof(SemiFunc), "InputScrollY")
			});
			int index = val.Index;
			val.Index = index - 1;
			val.Remove();
			ILLabel val3 = val.DefineLabel();
			val.Emit(OpCodes.Bne_Un_S, (object)val3);
			val.Index += 2;
			object operand = il.Instrs[val.Index].Operand;
			ILLabel val4 = (ILLabel)((operand is ILLabel) ? operand : null);
			index = val.Index;
			val.Index = index + 1;
			val.RemoveRange(24);
			val.MarkLabel(val3);
			val.Emit(OpCodes.Ldarg_0);
			val.Emit(OpCodes.Ldarg_0);
			val.Emit<MenuScrollBox>(OpCodes.Ldfld, "parentPage");
			val.EmitDelegate<Action<MenuScrollBox, MenuPage>>((Action<MenuScrollBox, MenuPage>)delegate(MenuScrollBox menuScrollBox, MenuPage menuPage)
			{
				//IL_0087: Unknown result type (might be due to invalid IL or missing references)
				//IL_008c: Unknown result type (might be due to invalid IL or missing references)
				float num3 = SemiFunc.InputMovementY() / 20f;
				float num4 = SemiFunc.InputScrollY();
				float num7;
				if (MenuAPI.customMenuPages.TryGetValue(menuPage, out var value))
				{
					float? scrollSpeed = value.scrollView.scrollSpeed;
					if (scrollSpeed.HasValue)
					{
						float valueOrDefault = scrollSpeed.GetValueOrDefault();
						valueOrDefault *= 10f;
						float num5 = Mathf.Abs((float)REPOReflection.menuScrollBox_ScrollerEndPosition.GetValue(menuScrollBox) - (float)REPOReflection.menuScrollBox_ScrollerStartPosition.GetValue(menuScrollBox));
						float num6 = (num3 + (float)Math.Sign(num4)) * valueOrDefault / num5;
						Rect rect2 = menuScrollBox.scrollBarBackground.rect;
						num7 = num6 * ((Rect)(ref rect2)).height;
						goto IL_00c1;
					}
				}
				float num8 = (float)REPOReflection.menuScrollBox_ScrollHeight.GetValue(menuScrollBox);
				num7 = num3 / (num8 * 0.01f) + num4 / (num8 * 0.01f);
				goto IL_00c1;
				IL_00c1:
				float num9 = (float)REPOReflection.menuScrollBox_ScrollHandleTargetPosition.GetValue(menuScrollBox);
				REPOReflection.menuScrollBox_ScrollHandleTargetPosition.SetValue(menuScrollBox, num9 + num7);
			});
			val.GotoPrev(new Func<Instruction, bool>[1]
			{
				(Instruction instruction) => ILPatternMatchingExt.MatchCall(instruction, typeof(SemiFunc), "InputMovementY")
			});
			ILLabel val5 = val.MarkLabel();
			val.Emit(OpCodes.Ldarg_0);
			val.Emit<MenuScrollBox>(OpCodes.Ldfld, "scrollBoxActive");
			val.Emit(OpCodes.Brfalse_S, (object)val4);
			val.GotoPrev((MoveType)2, new Func<Instruction, bool>[1]
			{
				(Instruction instruction) => ILPatternMatchingExt.MatchCall<Input>(instruction, "GetMouseButton")
			});
			val.Remove();
			val.Emit(OpCodes.Brfalse, (object)val5);
			val.GotoNext((MoveType)2, new Func<Instruction, bool>[1]
			{
				(Instruction instruction) => ILPatternMatchingExt.MatchCall(instruction, typeof(SemiFunc), "UIMouseHover")
			});
			val.Remove();
			val.Emit(OpCodes.Brfalse, (object)val5);
			val.GotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction instruction) => ILPatternMatchingExt.MatchStfld<MenuScrollBox>(instruction, "scrollAmount")
			});
			val.Index -= 13;
			val.RemoveRange(14);
			val.EmitDelegate<Action<MenuScrollBox>>((Action<MenuScrollBox>)delegate(MenuScrollBox instance)
			{
				//IL_0010: Unknown result type (might be due to invalid IL or missing references)
				//IL_001a: Expected O, but got Unknown
				//IL_0060: Unknown result type (might be due to invalid IL or missing references)
				//IL_0070: Unknown result type (might be due to invalid IL or missing references)
				//IL_0075: Unknown result type (might be due to invalid IL or missing references)
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_0032: 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_004e: Unknown result type (might be due to invalid IL or missing references)
				Rect rect;
				float num2;
				if (MenuAPI.customMenuPages.ContainsKey((MenuPage)REPOReflection.menuScrollBox_ParentPage.GetValue(instance)))
				{
					float num = ((Transform)instance.scrollHandle).localPosition.y + instance.scrollHandle.sizeDelta.y / 2f;
					rect = instance.scrollBarBackground.rect;
					num2 = num / ((Rect)(ref rect)).height;
				}
				else
				{
					float y = ((Transform)instance.scrollHandle).localPosition.y;
					rect = instance.scrollBarBackground.rect;
					num2 = y / ((Rect)(ref rect)).height * 1.1f;
				}
				REPOReflection.menuScrollBox_ScrollAmount.SetValue(instance, num2);
			});
		}

		private static void ChatManager_StateInactiveILHook(ILContext il)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			val.GotoNext((MoveType)2, new Func<Instruction, bool>[1]
			{
				(Instruction instruction) => ILPatternMatchingExt.MatchStfld<ChatManager>(instruction, "chatActive")
			});
			ILLabel val2 = val.DefineLabel();
			val.Emit<REPOInputStringSystem>(OpCodes.Ldsfld, "hasAnyFocus");
			val.Emit(OpCodes.Brfalse_S, (object)val2);
			val.Emit(OpCodes.Ret);
			val.MarkLabel(val2);
		}

		private void Awake()
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_022a: Unknown result type (might be due to invalid IL or missing references)
			//IL_021f: 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_022a: Expected O, but got Unknown
			//IL_0270: Unknown result type (might be due to invalid IL or missing references)
			//IL_0265: 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_0270: Expected O, but got Unknown
			//IL_02b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b6: Expected O, but got Unknown
			//IL_02fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02fc: Expected O, but got Unknown
			logger.LogDebug((object)"Hooking `MenuPageMain.Start`");
			new Hook((MethodBase)AccessTools.Method(typeof(MenuPageMain), "Start", (Type[])null, (Type[])null), (Delegate)new Action<Action<MenuPageMain>, MenuPageMain>(MenuPageMain_StartHook));
			logger.LogDebug((object)"Hooking `MenuPageSettings.Start`");
			new Hook((MethodBase)AccessTools.Method(typeof(MenuPageSettings), "Start", (Type[])null, (Type[])null), (Delegate)new Action<Action<MenuPageSettings>, MenuPageSettings>(MenuPageSettings_StartHook));
			logger.LogDebug((object)"Hooking `MenuPageColor.Start`");
			new Hook((MethodBase)AccessTools.Method(typeof(MenuPageColor), "Start", (Type[])null, (Type[])null), (Delegate)new Action<Action<MenuPageColor>, MenuPageColor>(MenuPageColor_StartHook));
			logger.LogDebug((object)"Hooking `MenuPageEsc.Start`");
			new Hook((MethodBase)AccessTools.Method(typeof(MenuPageEsc), "Start", (Type[])null, (Type[])null), (Delegate)new Action<Action<MenuPageEsc>, MenuPageEsc>(MenuPageEsc_StartHook));
			logger.LogDebug((object)"Hooking `MenuPageRegions.Start`");
			new Hook((MethodBase)AccessTools.Method(typeof(MenuPageRegions), "Start", (Type[])null, (Type[])null), (Delegate)new Action<Action<MenuPageRegions>, MenuPageRegions>(MenuPageRegions_StartHook));
			logger.LogDebug((object)"Hooking `MenuPageServerList.Start`");
			new Hook((MethodBase)AccessTools.Method(typeof(MenuPageServerList), "Start", (Type[])null, (Type[])null), (Delegate)new Action<Action<MenuPageServerList>, MenuPageServerList>(MenuPageServerList_StartHook));
			logger.LogDebug((object)"Hooking `MenuPageLobby.Start`");
			new Hook((MethodBase)AccessTools.Method(typeof(MenuPageLobby), "Start", (Type[])null, (Type[])null), (Delegate)new Action<Action<MenuPageLobby>, MenuPageLobby>(MenuPageLobby_StartHook));
			logger.LogDebug((object)"Hooking `SemiFunc.UIMouseHover`");
			MethodInfo methodInfo = AccessTools.Method(typeof(SemiFunc), "UIMouseHover", (Type[])null, (Type[])null);
			object obj = <>O.<7>__SemiFunc_UIMouseHoverILHook;
			if (obj == null)
			{
				Manipulator val = SemiFunc_UIMouseHoverILHook;
				<>O.<7>__SemiFunc_UIMouseHoverILHook = val;
				obj = (object)val;
			}
			new ILHook((MethodBase)methodInfo, (Manipulator)obj);
			logger.LogDebug((object)"Hooking `MenuPage.StateClosing`");
			MethodInfo methodInfo2 = AccessTools.Method(typeof(MenuPage), "StateClosing", (Type[])null, (Type[])null);
			object obj2 = <>O.<8>__MenuPage_StateClosingILHook;
			if (obj2 == null)
			{
				Manipulator val2 = MenuPage_StateClosingILHook;
				<>O.<8>__MenuPage_StateClosingILHook = val2;
				obj2 = (object)val2;
			}
			new ILHook((MethodBase)methodInfo2, (Manipulator)obj2);
			logger.LogDebug((object)"Hooking `MenuScrollBox.Update`");
			MethodInfo methodInfo3 = AccessTools.Method(typeof(MenuScrollBox), "Update", (Type[])null, (Type[])null);
			object obj3 = <>O.<9>__MenuScrollBox_UpdateILHook;
			if (obj3 == null)
			{
				Manipulator val3 = MenuScrollBox_UpdateILHook;
				<>O.<9>__MenuScrollBox_UpdateILHook = val3;
				obj3 = (object)val3;
			}
			new ILHook((MethodBase)methodInfo3, (Manipulator)obj3);
			logger.LogDebug((object)"Hooking `ChatManager.StateInactive`");
			MethodInfo methodInfo4 = AccessTools.Method(typeof(ChatManager), "StateInactive", (Type[])null, (Type[])null);
			object obj4 = <>O.<10>__ChatManager_StateInactiveILHook;
			if (obj4 == null)
			{
				Manipulator val4 = ChatManager_StateInactiveILHook;
				<>O.<10>__ChatManager_StateInactiveILHook = val4;
				obj4 = (object)val4;
			}
			new ILHook((MethodBase)methodInfo4, (Manipulator)obj4);
		}
	}
	public static class MenuAPI
	{
		public delegate void BuilderDelegate(Transform parent);

		internal static BuilderDelegate mainMenuBuilderDelegate;

		internal static BuilderDelegate settingsMenuBuilderDelegate;

		internal static BuilderDelegate colorMenuBuilderDelegate;

		internal static BuilderDelegate lobbyMenuBuilderDelegate;

		internal static BuilderDelegate escapeMenuBuilderDelegate;

		internal static BuilderDelegate regionSelectionMenuBuilderDelegate;

		internal static BuilderDelegate serverListMenuBuilderDelegate;

		internal static readonly Dictionary<MenuPage, REPOPopupPage> customMenuPages = new Dictionary<MenuPage, REPOPopupPage>();

		private static MenuButtonPopUp menuButtonPopup;

		public static void AddElementToMainMenu(BuilderDelegate builderDelegate)
		{
			mainMenuBuilderDelegate = (BuilderDelegate)Delegate.Combine(mainMenuBuilderDelegate, builderDelegate);
		}

		public static void AddElementToSettingsMenu(BuilderDelegate builderDelegate)
		{
			settingsMenuBuilderDelegate = (BuilderDelegate)Delegate.Combine(settingsMenuBuilderDelegate, builderDelegate);
		}

		public static void AddElementToColorMenu(BuilderDelegate builderDelegate)
		{
			colorMenuBuilderDelegate = (BuilderDelegate)Delegate.Combine(colorMenuBuilderDelegate, builderDelegate);
		}

		public static void AddElementToLobbyMenu(BuilderDelegate builderDelegate)
		{
			lobbyMenuBuilderDelegate = (BuilderDelegate)Delegate.Combine(lobbyMenuBuilderDelegate, builderDelegate);
		}

		public static void AddElementToEscapeMenu(BuilderDelegate builderDelegate)
		{
			escapeMenuBuilderDelegate = (BuilderDelegate)Delegate.Combine(escapeMenuBuilderDelegate, builderDelegate);
		}

		public static void AddElementToRegionSelectionMenu(BuilderDelegate builderDelegate)
		{
			regionSelectionMenuBuilderDelegate = (BuilderDelegate)Delegate.Combine(regionSelectionMenuBuilderDelegate, builderDelegate);
		}

		public static void AddElementToServerListMenu(BuilderDelegate builderDelegate)
		{
			serverListMenuBuilderDelegate = (BuilderDelegate)Delegate.Combine(serverListMenuBuilderDelegate, builderDelegate);
		}

		public static void CloseAllPagesAddedOnTop()
		{
			MenuManager.instance.PageCloseAllAddedOnTop();
		}

		public static void OpenPopup(string header, Color headerColor, string content, Action onLeftClicked, Action onRightClicked = null)
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Expected O, but got Unknown
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Expected O, but got Unknown
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Expected O, but got Unknown
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Expected O, but got Unknown
			if (!Object.op_Implicit((Object)(object)menuButtonPopup))
			{
				menuButtonPopup = ((Component)MenuManager.instance).gameObject.AddComponent<MenuButtonPopUp>();
			}
			menuButtonPopup.option1Event = new UnityEvent();
			menuButtonPopup.option2Event = new UnityEvent();
			if (onLeftClicked != null)
			{
				menuButtonPopup.option1Event.AddListener(new UnityAction(onLeftClicked.Invoke));
			}
			if (onRightClicked != null)
			{
				menuButtonPopup.option2Event.AddListener(new UnityAction(onRightClicked.Invoke));
			}
			MenuManager.instance.PagePopUpTwoOptions(menuButtonPopup, header, headerColor, content, "Yes", "No", true);
		}

		public static REPOButton CreateREPOButton(string text, Action onClick, Transform parent, Vector2 localPosition = default(Vector2))
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			RectTransform obj = Object.Instantiate<RectTransform>(REPOTemplates.buttonTemplate, parent);
			((Object)obj).name = "Button - " + text;
			((Transform)obj).localPosition = Vector2.op_Implicit(localPosition);
			REPOButton rEPOButton = ((Component)obj).gameObject.AddComponent<REPOButton>();
			((TMP_Text)rEPOButton.labelTMP).text = text;
			rEPOButton.onClick = onClick;
			return rEPOButton;
		}

		public static REPOToggle CreateREPOToggle(string text, Action<bool> onToggle, Transform parent, Vector2 localPosition = default(Vector2), string leftButtonText = "ON", string rightButtonText = "OFF", bool defaultValue = false)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			RectTransform obj = Object.Instantiate<RectTransform>(REPOTemplates.toggleTemplate, parent);
			((Object)obj).name = "Toggle - " + text;
			((Transform)obj).localPosition = Vector2.op_Implicit(localPosition);
			REPOToggle rEPOToggle = ((Component)obj).gameObject.AddComponent<REPOToggle>();
			((TMP_Text)rEPOToggle.labelTMP).text = text;
			((TMP_Text)rEPOToggle.leftButtonTMP).text = leftButtonText;
			((TMP_Text)rEPOToggle.rightButtonTMP).text = rightButtonText;
			rEPOToggle.onToggle = onToggle;
			rEPOToggle.SetState(defaultValue, invokeCallback: false);
			return rEPOToggle;
		}

		public static REPOInputField CreateREPOInputField(string labelText, Action<string> onValueChanged, Transform parent, Vector2 localPosition = default(Vector2), bool onlyNotifyOnSubmit = false, string placeholder = "", string defaultValue = "")
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			RectTransform obj = Object.Instantiate<RectTransform>(REPOTemplates.toggleTemplate, parent);
			((Object)obj).name = "Input Field - " + labelText;
			((Transform)obj).localPosition = Vector2.op_Implicit(localPosition);
			REPOInputField rEPOInputField = ((Component)obj).gameObject.AddComponent<REPOInputField>();
			((TMP_Text)rEPOInputField.labelTMP).text = labelText;
			rEPOInputField.inputStringSystem.onValueChanged = onValueChanged;
			rEPOInputField.inputStringSystem.onlyNotifyOnSubmit = onlyNotifyOnSubmit;
			rEPOInputField.inputStringSystem.placeholder = placeholder;
			rEPOInputField.inputStringSystem.SetValue(defaultValue, notify: false);
			return rEPOInputField;
		}

		public static REPOSlider CreateREPOSlider(string text, string description, Action<float> onValueChanged, Transform parent, Vector2 localPosition = default(Vector2), float min = 0f, float max = 1f, int precision = 2, float defaultValue = 0f, string prefix = "", string postfix = "", REPOSlider.BarBehavior barBehavior = REPOSlider.BarBehavior.UpdateWithValue)
		{
			//IL_001d: 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)
			RectTransform obj = Object.Instantiate<RectTransform>(REPOTemplates.sliderTemplate, parent);
			((Object)obj).name = "Float Slider - " + text;
			((Transform)obj).localPosition = Vector2.op_Implicit(localPosition);
			REPOSlider rEPOSlider = ((Component)obj).gameObject.AddComponent<REPOSlider>();
			((TMP_Text)rEPOSlider.labelTMP).text = text;
			((TMP_Text)rEPOSlider.descriptionTMP).text = description;
			rEPOSlider.onValueChanged = onValueChanged;
			rEPOSlider.min = min;
			rEPOSlider.max = max;
			rEPOSlider.precision = precision;
			rEPOSlider.prefix = prefix;
			rEPOSlider.postfix = postfix;
			rEPOSlider.barBehavior = barBehavior;
			rEPOSlider.SetValue(defaultValue, invokeCallback: false);
			return rEPOSlider;
		}

		public static REPOSlider CreateREPOSlider(string text, string description, Action<int> onValueChanged, Transform parent, Vector2 localPosition = default(Vector2), int min = 0, int max = 1, int defaultValue = 0, string prefix = "", string postfix = "", REPOSlider.BarBehavior barBehavior = REPOSlider.BarBehavior.UpdateWithValue)
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			RectTransform obj = Object.Instantiate<RectTransform>(REPOTemplates.sliderTemplate, parent);
			((Object)obj).name = "Int Slider - " + text;
			((Transform)obj).localPosition = Vector2.op_Implicit(localPosition);
			REPOSlider rEPOSlider = ((Component)obj).gameObject.AddComponent<REPOSlider>();
			((TMP_Text)rEPOSlider.labelTMP).text = text;
			((TMP_Text)rEPOSlider.descriptionTMP).text = description;
			rEPOSlider.onValueChanged = delegate(float f)
			{
				onValueChanged(Convert.ToInt32(f));
			};
			rEPOSlider.min = min;
			rEPOSlider.max = max;
			rEPOSlider.precision = 0;
			rEPOSlider.prefix = prefix;
			rEPOSlider.postfix = postfix;
			rEPOSlider.barBehavior = barBehavior;
			rEPOSlider.SetValue(defaultValue, invokeCallback: false);
			return rEPOSlider;
		}

		public static REPOSlider CreateREPOSlider(string text, string description, Action<string> onOptionChanged, Transform parent, string[] stringOptions, string defaultOption, Vector2 localPosition = default(Vector2), string prefix = "", string postfix = "", REPOSlider.BarBehavior barBehavior = REPOSlider.BarBehavior.UpdateWithValue)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			RectTransform val = Object.Instantiate<RectTransform>(REPOTemplates.sliderTemplate, parent);
			((Object)val).name = "Option Slider - " + text;
			((Transform)val).localPosition = Vector2.op_Implicit(localPosition);
			REPOSlider repoSlider = ((Component)val).gameObject.AddComponent<REPOSlider>();
			((TMP_Text)repoSlider.labelTMP).text = text;
			((TMP_Text)repoSlider.descriptionTMP).text = description;
			repoSlider.onValueChanged = delegate(float f)
			{
				onOptionChanged(repoSlider.stringOptions.ElementAtOrDefault(Convert.ToInt32(f)) ?? repoSlider.stringOptions.FirstOrDefault());
			};
			repoSlider.stringOptions = stringOptions;
			repoSlider.prefix = prefix;
			repoSlider.postfix = postfix;
			repoSlider.barBehavior = barBehavior;
			int num = Array.IndexOf(stringOptions, defaultOption);
			if (num == -1)
			{
				num = 0;
			}
			repoSlider.SetValue(num, invokeCallback: false);
			return repoSlider;
		}

		public static REPOSlider CreateREPOSlider(string text, string description, Action<int> onOptionChanged, Transform parent, string[] stringOptions, string defaultOption, Vector2 localPosition = default(Vector2), string prefix = "", string postfix = "", REPOSlider.BarBehavior barBehavior = REPOSlider.BarBehavior.UpdateWithValue)
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			RectTransform obj = Object.Instantiate<RectTransform>(REPOTemplates.sliderTemplate, parent);
			((Object)obj).name = "Option Slider - " + text;
			((Transform)obj).localPosition = Vector2.op_Implicit(localPosition);
			REPOSlider rEPOSlider = ((Component)obj).gameObject.AddComponent<REPOSlider>();
			((TMP_Text)rEPOSlider.labelTMP).text = text;
			((TMP_Text)rEPOSlider.descriptionTMP).text = description;
			rEPOSlider.onValueChanged = delegate(float f)
			{
				onOptionChanged(Convert.ToInt32(f));
			};
			rEPOSlider.stringOptions = stringOptions;
			rEPOSlider.prefix = prefix;
			rEPOSlider.postfix = postfix;
			rEPOSlider.barBehavior = barBehavior;
			int num = Array.IndexOf(stringOptions, defaultOption);
			if (num == -1)
			{
				num = 0;
			}
			rEPOSlider.SetValue(num, invokeCallback: false);
			return rEPOSlider;
		}

		public static REPOLabel CreateREPOLabel(string text, Transform parent, Vector2 localPosition = default(Vector2))
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			RectTransform obj = Object.Instantiate<RectTransform>(REPOTemplates.labelTemplate, parent);
			((Object)obj).name = "Label - " + text;
			((Transform)obj).localPosition = Vector2.op_Implicit(localPosition);
			REPOLabel rEPOLabel = ((Component)obj).gameObject.AddComponent<REPOLabel>();
			((TMP_Text)rEPOLabel.labelTMP).text = text;
			return rEPOLabel;
		}

		public static REPOSpacer CreateREPOSpacer(Transform parent, Vector2 localPosition = default(Vector2), Vector2 size = default(Vector2))
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			RectTransform val = (RectTransform)new GameObject("Spacer", new Type[1] { typeof(RectTransform) }).transform;
			((Transform)val).SetParent(parent);
			REPOSpacer result = ((Component)val).gameObject.AddComponent<REPOSpacer>();
			((Transform)val).localPosition = Vector2.op_Implicit(localPosition);
			val.sizeDelta = size;
			return result;
		}

		[Obsolete("Switch to the overload with the 'shouldCachePage' argument!")]
		public static REPOPopupPage CreateREPOPopupPage(string headerText, REPOPopupPage.PresetSide presetSide, bool pageDimmerVisibility = false, float spacing = 0f)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			return CreateREPOPopupPage(headerText, pageDimmerVisibility, spacing, (presetSide == REPOPopupPage.PresetSide.Left) ? null : new Vector2?(new Vector2(40f, 0f)));
		}

		[Obsolete("Switch to the overload with the 'shouldCachePage' argument!")]
		public static REPOPopupPage CreateREPOPopupPage(string headerText, bool pageDimmerVisibility = false, float spacing = 0f, Vector2? localPosition = null)
		{
			return CreateREPOPopupPage(headerText, shouldCachePage: false, pageDimmerVisibility, spacing, localPosition);
		}

		public static REPOPopupPage CreateREPOPopupPage(string headerText, REPOPopupPage.PresetSide presetSide, bool shouldCachePage, bool pageDimmerVisibility = false, float spacing = 0f)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			return CreateREPOPopupPage(headerText, shouldCachePage, pageDimmerVisibility, spacing, (presetSide == REPOPopupPage.PresetSide.Left) ? null : new Vector2?(new Vector2(40f, 0f)));
		}

		public static REPOPopupPage CreateREPOPopupPage(string headerText, bool shouldCachePage, bool pageDimmerVisibility = false, float spacing = 0f, Vector2? localPosition = null)
		{
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			RectTransform obj = Object.Instantiate<RectTransform>(REPOTemplates.popupPageTemplate, ((Component)MenuHolder.instance).transform);
			((Object)obj).name = "Menu Page " + headerText;
			REPOPopupPage rEPOPopupPage = ((Component)obj).gameObject.AddComponent<REPOPopupPage>();
			((Transform)rEPOPopupPage.rectTransform).localPosition = Vector2.op_Implicit((Vector2)(((??)localPosition) ?? new Vector2(-280f, 0f)));
			((TMP_Text)rEPOPopupPage.headerTMP).text = headerText;
			rEPOPopupPage.isCachedPage = shouldCachePage;
			rEPOPopupPage.pageDimmerVisibility = pageDimmerVisibility;
			rEPOPopupPage.scrollView.spacing = spacing;
			return rEPOPopupPage;
		}

		public static REPOAvatarPreview CreateREPOAvatarPreview(Transform parent, Vector2 localPosition = default(Vector2), bool enableBackgroundImage = false, Color? backgroundImageColor = null)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			Transform obj = Object.Instantiate<Transform>(REPOTemplates.avatarPreviewTemplate, parent);
			((Object)obj).name = "Player Avatar Preview";
			REPOAvatarPreview rEPOAvatarPreview = ((Component)obj).gameObject.AddComponent<REPOAvatarPreview>();
			((Transform)rEPOAvatarPreview.rectTransform).localPosition = Vector2.op_Implicit(localPosition);
			rEPOAvatarPreview.enableBackgroundImage = enableBackgroundImage;
			rEPOAvatarPreview.backgroundImageColor = (Color)(((??)backgroundImageColor) ?? Color.white);
			rEPOAvatarPreview.previewSize = new Vector2(184f, 345f);
			return rEPOAvatarPreview;
		}

		public static REPOObjectPreview CreateREPOObjectPreview(Transform parent, GameObject previewObject, Vector2 localPosition = default(Vector2), bool enableBackgroundImage = false, Color? backgroundImageColor = null)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			Transform obj = Object.Instantiate<Transform>(REPOTemplates.avatarPreviewTemplate, parent);
			((Object)obj).name = "Object Preview";
			REPOObjectPreview rEPOObjectPreview = ((Component)obj).gameObject.AddComponent<REPOObjectPreview>();
			((Transform)rEPOObjectPreview.rectTransform).localPosition = Vector2.op_Implicit(localPosition);
			rEPOObjectPreview.enableBackgroundImage = enableBackgroundImage;
			rEPOObjectPreview.backgroundImageColor = (Color)(((??)backgroundImageColor) ?? Color.white);
			rEPOObjectPreview.previewObject = previewObject;
			rEPOObjectPreview.previewSize = new Vector2(184f, 345f);
			return rEPOObjectPreview;
		}

		internal static void OpenMenuPage(MenuPage menuPage, bool pageOnTop)
		{
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			object? value = REPOReflection.menuManager_CurrentMenuPage.GetValue(MenuManager.instance);
			MenuPage val = (MenuPage)((value is MenuPage) ? value : null);
			List<MenuPage> list = REPOReflection.menuManager_AddedPagesOnTop.GetValue(MenuManager.instance) as List<MenuPage>;
			if (pageOnTop && !Object.op_Implicit((Object)(object)val))
			{
				pageOnTop = false;
			}
			if (pageOnTop)
			{
				if (list == null || list.Contains(val))
				{
					return;
				}
			}
			else if (Object.op_Implicit((Object)(object)val))
			{
				REPOReflection.menuManager_PageInactiveAdd.Invoke(MenuManager.instance, new object[1] { val });
				val.PageStateSet((PageState)3);
			}
			((Component)menuPage).transform.SetAsLastSibling();
			((Behaviour)menuPage).enabled = true;
			menuPage.ResetPage();
			menuPage.PageStateSet((PageState)0);
			MenuManager.instance.PageAdd(menuPage);
			((MonoBehaviour)menuPage).StartCoroutine(REPOReflection.menuPage_LateStart.Invoke(menuPage, null) as IEnumerator);
			REPOReflection.menuPage_AddedPageOnTop.SetValue(menuPage, false);
			if (!pageOnTop)
			{
				MenuManager.instance.PageSetCurrent(menuPage.menuPageIndex, menuPage);
				REPOReflection.menuPage_PageIsOnTopOfOtherPage.SetValue(menuPage, true);
				REPOReflection.menuPage_PageUnderThisPage.SetValue(menuPage, val);
			}
			else
			{
				REPOReflection.menuPage_ParentPage.SetValue(menuPage, val);
				list.Add(menuPage);
			}
		}

		internal static void CloseMenuPage(MenuPage menuPage, bool closePagesAddedOnTop)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			if (closePagesAddedOnTop)
			{
				CloseAllPagesAddedOnTop();
			}
			menuPage.PageStateSet((PageState)2);
			object? value = REPOReflection.menuPage_PageUnderThisPage.GetValue(menuPage);
			MenuPage val = (MenuPage)((value is MenuPage) ? value : null);
			if (val != null)
			{
				MenuManager.instance.PageSetCurrent(val.menuPageIndex, val);
			}
		}
	}
	public static class REPOReflection
	{
		public static readonly FieldInfo menuManager_CurrentMenuPage = AccessTools.Field(typeof(MenuManager), "currentMenuPage");

		public static readonly FieldInfo menuManager_AddedPagesOnTop = AccessTools.Field(typeof(MenuManager), "addedPagesOnTop");

		public static readonly FieldInfo menuPage_AddedPageOnTop = AccessTools.Field(typeof(MenuPage), "addedPageOnTop");

		public static readonly FieldInfo menuPage_PageUnderThisPage = AccessTools.Field(typeof(MenuPage), "pageUnderThisPage");

		public static readonly FieldInfo menuPage_ParentPage = AccessTools.Field(typeof(MenuPage), "parentPage");

		public static readonly FieldInfo menuPage_PageIsOnTopOfOtherPage = AccessTools.Field(typeof(MenuPage), "pageIsOnTopOfOtherPage");

		public static readonly FieldInfo menuPage_ScrollBoxes = AccessTools.Field(typeof(MenuPage), "scrollBoxes");

		public static readonly FieldInfo menuPage_CurrentPageState = AccessTools.Field(typeof(MenuPage), "currentPageState");

		public static readonly FieldInfo menuPage_AnimateAwayPosition = AccessTools.Field(typeof(MenuPage), "animateAwayPosition");

		public static readonly FieldInfo menuButton_ParentPage = AccessTools.Field(typeof(MenuButton), "parentPage");

		public static readonly FieldInfo menuScrollBox_ScrollerEndPosition = AccessTools.Field(typeof(MenuScrollBox), "scrollerEndPosition");

		public static readonly FieldInfo menuScrollBox_ScrollerStartPosition = AccessTools.Field(typeof(MenuScrollBox), "scrollerStartPosition");

		public static readonly FieldInfo menuScrollBox_ScrollHandleTargetPosition = AccessTools.Field(typeof(MenuScrollBox), "scrollHandleTargetPosition");

		public static readonly FieldInfo menuScrollBox_ScrollHeight = AccessTools.Field(typeof(MenuScrollBox), "scrollHeight");

		public static readonly FieldInfo menuScrollBox_ScrollAmount = AccessTools.Field(typeof(MenuScrollBox), "scrollAmount");

		public static readonly FieldInfo menuScrollBox_ParentPage = AccessTools.Field(typeof(MenuScrollBox), "parentPage");

		public static readonly FieldInfo menuSelectableElement_MenuID = AccessTools.Field(typeof(MenuSelectableElement), "menuID");

		public static readonly MethodInfo menuManager_PageInactiveAdd = AccessTools.Method(typeof(MenuManager), "PageInactiveAdd", (Type[])null, (Type[])null);

		public static readonly MethodInfo menuPage_LateStart = AccessTools.Method(typeof(MenuPage), "LateStart", (Type[])null, (Type[])null);
	}
	internal static class REPOTemplates
	{
		internal static readonly RectTransform pageDimmerTemplate;

		internal static readonly RectTransform simplePageTemplate;

		internal static readonly RectTransform buttonTemplate;

		internal static readonly RectTransform popupPageTemplate;

		internal static readonly RectTransform toggleTemplate;

		internal static readonly RectTransform sliderTemplate;

		internal static readonly RectTransform labelTemplate;

		internal static readonly Transform avatarPreviewTemplate;

		static REPOTemplates()
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Expected I4, but got Unknown
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Expected O, but got Unknown
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Expected O, but got Unknown
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Expected O, but got Unknown
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Expected O, but got Unknown
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Expected O, but got Unknown
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Expected O, but got Unknown
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Expected O, but got Unknown
			MenuManager instance = MenuManager.instance;
			if (!Object.op_Implicit((Object)(object)instance))
			{
				throw new NullReferenceException("Error fetching templates... Ensure you're not creating UI elements too early, use \"MenuAPI.AddElementTo...\"");
			}
			foreach (MenuPages menuPage in instance.menuPages)
			{
				Transform transform = menuPage.menuPage.transform;
				MenuPageIndex menuPageIndex = menuPage.menuPageIndex;
				switch ((int)menuPageIndex)
				{
				case 0:
					simplePageTemplate = (RectTransform)transform;
					buttonTemplate = (RectTransform)((Transform)simplePageTemplate).Find("Menu Button - Quit game");
					break;
				case 2:
					pageDimmerTemplate = (RectTransform)transform.GetChild(0);
					break;
				case 4:
					popupPageTemplate = (RectTransform)transform;
					break;
				case 5:
				{
					Transform obj = transform.Find("Menu Scroll Box/Mask/Scroller");
					toggleTemplate = (RectTransform)obj.Find("Bool Setting - Push to Talk");
					sliderTemplate = (RectTransform)obj.Find("Slider - microphone");
					break;
				}
				case 6:
					labelTemplate = (RectTransform)transform.Find("Scroll Box/Mask/Scroller").Find("Header Movement");
					break;
				case 1:
					avatarPreviewTemplate = transform.Find("Menu Element Player Avatar");
					break;
				}
			}
		}
	}
}
namespace MenuLib.Structs
{
	public struct Padding
	{
		public float left;

		public float top;

		public float right;

		public float bottom;

		public Padding(float left, float top, float right, float bottom)
		{
			this.left = left;
			this.top = top;
			this.right = right;
			this.bottom = bottom;
		}
	}
}
namespace MenuLib.MonoBehaviors
{
	public sealed class REPOAvatarPreview : REPOElement
	{
		private PlayerAvatarMenu playerAvatarMenu;

		private Image backgroundImage;

		private RectTransform renderTextureRectTransform;

		public bool enableBackgroundImage
		{
			get
			{
				return ((Behaviour)backgroundImage).enabled;
			}
			set
			{
				((Behaviour)backgroundImage).enabled = value;
			}
		}

		public Color backgroundImageColor
		{
			get
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				return ((Graphic)backgroundImage).color;
			}
			set
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				((Graphic)backgroundImage).color = value;
			}
		}

		public Vector2 previewSize
		{
			get
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				return base.rectTransform.sizeDelta;
			}
			set
			{
				//IL_0000: Unknown result type (might be due to invalid IL or missing references)
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				//IL_0028: Unknown result type (might be due to invalid IL or missing references)
				//IL_0029: Unknown result type (might be due to invalid IL or missing references)
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				//IL_003d: Unknown result type (might be due to invalid IL or missing references)
				//IL_003e: Unknown result type (might be due to invalid IL or missing references)
				//IL_000e: Unknown result type (might be due to invalid IL or missing references)
				//IL_000f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0012: Unknown result type (might be due to invalid IL or missing references)
				//IL_0023: Unknown result type (might be due to invalid IL or missing references)
				//IL_0024: Unknown result type (might be due to invalid IL or missing references)
				//IL_004c: Unknown result type (might be due to invalid IL or missing references)
				//IL_004d: Unknown result type (might be due to invalid IL or missing references)
				//IL_004e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0054: Unknown result type (might be due to invalid IL or missing references)
				//IL_0060: Unknown result type (might be due to invalid IL or missing references)
				Vector2 val;
				if (value.x > value.y)
				{
					val = value;
					val.y = value.x / (8f / 15f);
					value = val;
				}
				else
				{
					val = value;
					val.x = value.y * (8f / 15f);
					value = val;
				}
				RectTransform obj = renderTextureRectTransform;
				val = (base.rectTransform.sizeDelta = value);
				obj.sizeDelta = val;
				((Transform)renderTextureRectTransform).localPosition = Vector3.zero;
			}
		}

		public PlayerAvatarVisuals playerAvatarVisuals { get; private set; }

		public Transform rigTransform => playerAvatarVisuals.meshParent.transform;

		private void Awake()
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Expected O, but got Unknown
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			base.rectTransform = ((Component)this).gameObject.AddComponent<RectTransform>();
			base.rectTransform.pivot = Vector2.right;
			RectTransform obj = base.rectTransform;
			Vector2 anchorMin = (base.rectTransform.anchorMax = Vector2.zero);
			obj.anchorMin = anchorMin;
			renderTextureRectTransform = (RectTransform)((Transform)base.rectTransform).GetChild(1);
			((Transform)renderTextureRectTransform).localPosition = Vector3.zero;
			playerAvatarMenu = ((Component)this).GetComponentInChildren<PlayerAvatarMenuHover>().playerAvatarMenu;
			playerAvatarVisuals = ((Component)playerAvatarMenu).GetComponentInChildren<PlayerAvatarVisuals>();
			backgroundImage = ((Component)this).gameObject.AddComponent<Image>();
			((Behaviour)backgroundImage).enabled = false;
		}

		private void OnDestroy()
		{
			if (Object.op_Implicit((Object)(object)playerAvatarMenu))
			{
				if (Object.op_Implicit((Object)(object)playerAvatarMenu.cameraAndStuff))
				{
					Object.Destroy((Object)(object)((Component)playerAvatarMenu.cameraAndStuff).gameObject);
				}
				Object.Destroy((Object)(object)((Component)playerAvatarMenu).gameObject);
			}
		}
	}
	public sealed class REPOButton : REPOElement
	{
		public MenuButton menuButton;

		public TextMeshProUGUI labelTMP;

		[Obsolete("Update the button clicked event using the 'onClick' field rather than through the button")]
		public Button button;

		public Action onClick;

		public Vector2? overrideButtonSize;

		private string previousText;

		private float previousFontSize;

		private float previousFontSizeMin;

		private float previousFontSizeMax;

		private Vector2? previousOverrideButtonSize;

		public Vector2 GetLabelSize()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			return ((TMP_Text)labelTMP).GetPreferredValues();
		}

		private void Awake()
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Expected O, but got Unknown
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Expected O, but got Unknown
			Transform transform = ((Component)this).transform;
			base.rectTransform = (RectTransform)(object)((transform is RectTransform) ? transform : null);
			button = ((Component)this).GetComponent<Button>();
			menuButton = ((Component)this).GetComponent<MenuButton>();
			labelTMP = ((Component)this).GetComponentInChildren<TextMeshProUGUI>();
			button.onClick = new ButtonClickedEvent();
			((UnityEvent)button.onClick).AddListener((UnityAction)delegate
			{
				onClick?.Invoke();
			});
			Object.Destroy((Object)(object)((Component)this).GetComponent<MenuButtonPopUp>());
		}

		private void Update()
		{
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			if (((TMP_Text)labelTMP).text == previousText)
			{
				Vector2? val = overrideButtonSize;
				Vector2? val2 = previousOverrideButtonSize;
				if (val.HasValue == val2.HasValue && (!val.HasValue || val.GetValueOrDefault() == val2.GetValueOrDefault()) && Math.Abs(((TMP_Text)labelTMP).fontSize - previousFontSize) < float.Epsilon && Math.Abs(((TMP_Text)labelTMP).fontSizeMin - previousFontSizeMin) < float.Epsilon && Math.Abs(((TMP_Text)labelTMP).fontSizeMax - previousFontSizeMax) < float.Epsilon)
				{
					return;
				}
			}
			base.rectTransform.sizeDelta = (Vector2)(((??)overrideButtonSize) ?? GetLabelSize());
			previousText = ((TMP_Text)labelTMP).text;
			previousOverrideButtonSize = overrideButtonSize;
			previousFontSize = ((TMP_Text)labelTMP).fontSize;
			previousFontSizeMin = ((TMP_Text)labelTMP).fontSizeMin;
			previousFontSizeMax = ((TMP_Text)labelTMP).fontSizeMax;
		}

		private void OnTransformParentChanged()
		{
			REPOReflection.menuButton_ParentPage.SetValue(menuButton, ((Component)this).GetComponentInParent<MenuPage>());
		}
	}
	public class REPOElement : MonoBehaviour
	{
		private REPOScrollViewElement _repoScrollViewElement;

		public RectTransform rectTransform { get; protected set; }

		public REPOScrollViewElement repoScrollViewElement
		{
			get
			{
				if (Object.op_Implicit((Object)(object)_repoScrollViewElement))
				{
					return _repoScrollViewElement;
				}
				return _repoScrollViewElement = ((Component)this).GetComponent<REPOScrollViewElement>();
			}
		}
	}
	public sealed class REPOInputField : REPOElement
	{
		public TextMeshProUGUI labelTMP;

		public REPOInputStringSystem inputStringSystem;

		private RectTransform inputAreaRectTransform;

		private MenuPage menuPage;

		private MenuSelectableElement menuSelectableElement;

		public Vector2 GetLabelSize()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			return ((TMP_Text)labelTMP).GetPreferredValues();
		}

		private void Awake()
		{
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: 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_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: 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_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0207: Unknown result type (might be due to invalid IL or missing references)
			//IL_020c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0237: Unknown result type (might be due to invalid IL or missing references)
			//IL_0247: Unknown result type (might be due to invalid IL or missing references)
			//IL_0266: Unknown result type (might be due to invalid IL or missing references)
			//IL_026b: Unknown result type (might be due to invalid IL or missing references)
			//IL_026c: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_02af: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b8: Unknown result type (might be due to invalid IL or missing references)
			Transform transform = ((Component)this).transform;
			base.rectTransform = (RectTransform)(object)((transform is RectTransform) ? transform : null);
			menuPage = ((Component)this).GetComponentInParent<MenuPage>();
			menuSelectableElement = ((Component)this).GetComponent<MenuSelectableElement>();
			labelTMP = ((Component)this).GetComponentInChildren<TextMeshProUGUI>();
			RectTransform obj = ((TMP_Text)labelTMP).rectTransform;
			obj.sizeDelta -= new Vector2(0f, 10f);
			Vector3 val = Vector3.right * 100f;
			Transform obj2 = ((Component)this).transform.Find("SliderBG");
			obj2.localPosition += val;
			Transform obj3 = ((Component)this).transform.Find("RawImage");
			obj3.localPosition += val;
			Transform obj4 = ((Component)this).transform.Find("RawImage (1)");
			obj4.localPosition += val;
			RectTransform obj5 = ((TMP_Text)labelTMP).rectTransform;
			((Transform)obj5).localPosition = ((Transform)obj5).localPosition + val;
			TextMeshProUGUI val2 = null;
			for (int i = 0; i < ((Component)this).transform.childCount; i++)
			{
				Transform child = ((Component)this).transform.GetChild(i);
				switch (((Object)child).name)
				{
				case "Option Box":
				case "Option Box Behind":
				case "RawImage (2)":
					Object.Destroy((Object)(object)((Component)child).gameObject);
					break;
				case "Button BUTTON":
					if (!Object.op_Implicit((Object)(object)val2))
					{
						val2 = ((Component)((Component)child).GetComponent<MenuButton>()).GetComponentInChildren<TextMeshProUGUI>();
						((TMP_Text)val2).transform.SetParent(child.parent);
					}
					Object.Destroy((Object)(object)((Component)child).gameObject);
					break;
				}
			}
			((TMP_Text)val2).rectTransform.pivot = Vector2.zero;
			((TMP_Text)val2).fontStyle = (FontStyles)0;
			((TMP_Text)val2).enableAutoSizing = false;
			((TMP_Text)val2).alignment = (TextAlignmentOptions)513;
			((TMP_Text)val2).margin = new Vector4(2f, 2f, 0f, 0f);
			TextMeshProUGUI obj6 = val2;
			TextMeshProUGUI obj7 = val2;
			float num2 = (((TMP_Text)val2).fontSize = 18f);
			float fontSizeMax = (((TMP_Text)obj7).fontSizeMin = num2);
			((TMP_Text)obj6).fontSizeMax = fontSizeMax;
			GameObject val3 = new GameObject("Input Area");
			val3.transform.parent = ((Component)this).transform;
			inputAreaRectTransform = val3.AddComponent<RectTransform>();
			inputAreaRectTransform.sizeDelta = new Vector2(146.5f, 20f);
			inputAreaRectTransform.pivot = Vector2.zero;
			((Transform)inputAreaRectTransform).localPosition = new Vector3(2f, 2.5f, 0f) + val;
			((Component)inputAreaRectTransform).gameObject.AddComponent<RectMask2D>();
			((TMP_Text)val2).transform.SetParent((Transform)(object)inputAreaRectTransform);
			Transform transform2 = ((TMP_Text)val2).transform;
			Vector2 val5 = (((TMP_Text)val2).rectTransform.sizeDelta = Vector2.op_Implicit(Vector3.zero));
			transform2.localPosition = Vector2.op_Implicit(val5);
			Object.Destroy((Object)(object)((Component)this).GetComponent<MenuSettingElement>());
			Object.Destroy((Object)(object)((Component)this).GetComponent<AudioButtonPushToTalk>());
			inputStringSystem = ((Component)this).gameObject.AddComponent<REPOInputStringSystem>();
			inputStringSystem.inputTMP = (TMP_Text)(object)val2;
			inputStringSystem.maskRectTransform = inputAreaRectTransform;
		}

		private void Update()
		{
			inputStringSystem.SetHovering(SemiFunc.UIMouseHover(menuPage, inputAreaRectTransform, (string)REPOReflection.menuSelectableElement_MenuID.GetValue(menuSelectableElement), 2f, 2f));
			if (Mouse.current.leftButton.wasPressedThisFrame)
			{
				inputStringSystem.isFocused = inputStringSystem.isHovering;
			}
		}
	}
	public sealed class REPOInputStringSystem : MonoBehaviour
	{
		public struct Colors
		{
			public Color focusedColor;

			public Color hoverColor;

			public Color unfocusedColor;

			public Color placeholderColor;

			public Color characterAddedColor;

			public Color characterRemovedColor;

			public Colors()
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				//IL_000c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				//IL_002b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0040: Unknown result type (might be due to invalid IL or missing references)
				//IL_0045: Unknown result type (might be due to invalid IL or missing references)
				//IL_005a: Unknown result type (might be due to invalid IL or missing references)
				//IL_005f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0074: Unknown result type (might be due to invalid IL or missing references)
				//IL_0079: Unknown result type (might be due to invalid IL or missing references)
				focusedColor = Color.white;
				hoverColor = Color.white;
				unfocusedColor = new Color(0.5f, 0.5f, 0.5f);
				placeholderColor = new Color(1f, 0.6f, 0.4f);
				characterAddedColor = new Color(0.5f, 1f, 0.5f);
				characterRemovedColor = new Color(1f, 0.5f, 0.5f);
			}
		}

		public static bool hasAnyFocus;

		public TMP_Text inputTMP;

		public RectTransform maskRectTransform;

		public Action<string> onValueChanged;

		public Colors colors = new Colors();

		public string placeholder = string.Empty;

		public bool onlyNotifyOnSubmit;

		public bool disableMovement = true;

		private string previousValue;

		private float timeSinceCharacterAdded = 1f;

		private float timeSinceCharacterRemoved = 1f;

		private bool pressedSubmit;

		private bool _isFocused;

		public string currentValue { get; private set; }

		public bool isHovering { get; private set; }

		public bool isFocused
		{
			get
			{
				return _isFocused;
			}
			set
			{
				//IL_004f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0060: Unknown result type (might be due to invalid IL or missing references)
				//IL_0065: Unknown result type (might be due to invalid IL or missing references)
				if (!value)
				{
					if (_isFocused)
					{
						MoveTMP(reset: true);
					}
				}
				else if (!isFocused)
				{
					if (IsTMPInMask())
					{
						MoveTMP(reset: true);
					}
					else
					{
						float num = 0f - inputTMP.GetPreferredValues(currentValue + "<b>|</b>").x;
						Rect rect = maskRectTransform.rect;
						MoveTMP(reset: true, num + ((Rect)(ref rect)).width - 6f);
					}
					((SemiUI)ChatUI.instance).Hide();
				}
				hasAnyFocus = (_isFocused = value);
			}
		}

		private bool shouldUsePlaceholder => string.IsNullOrEmpty(currentValue);

		public void SetValue(string value, bool notify)
		{
			string text2 = (currentValue = value);
			previousValue = text2;
			if (notify)
			{
				onValueChanged?.Invoke(value);
			}
		}

		public void SetHovering(bool value)
		{
			if (value && !isHovering)
			{
				MenuManager.instance.MenuEffectHover(SemiFunc.MenuGetPitchFromYPos(inputTMP.rectTransform), -1f);
			}
			isHovering = value;
		}

		private void Update()
		{
			if (!Object.op_Implicit((Object)(object)inputTMP))
			{
				return;
			}
			if (disableMovement && isFocused)
			{
				InputManager instance = InputManager.instance;
				if (instance != null)
				{
					instance.DisableMovement();
				}
			}
			HandleInput();
			UpdateColors();
			if (pressedSubmit)
			{
				isFocused = false;
				pressedSubmit = false;
				if (onlyNotifyOnSubmit)
				{
					onValueChanged?.Invoke(currentValue);
				}
			}
			if (!onlyNotifyOnSubmit && previousValue != currentValue)
			{
				onValueChanged?.Invoke(currentValue);
			}
			if (isFocused)
			{
				inputTMP.text = currentValue;
				if (timeSinceCharacterAdded < 0.5f || timeSinceCharacterRemoved < 0.5f || Mathf.Sin(Time.time * 10f) > 0f)
				{
					TMP_Text obj = inputTMP;
					obj.text += "<b>|</b>";
				}
			}
			else
			{
				inputTMP.text = (shouldUsePlaceholder ? placeholder : currentValue);
			}
			previousValue = currentValue;
		}

		private void OnDestroy()
		{
			hasAnyFocus = false;
		}

		private void HandleInput()
		{
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			if (timeSinceCharacterAdded < 1f)
			{
				timeSinceCharacterAdded += Time.deltaTime;
			}
			if (timeSinceCharacterRemoved < 1f)
			{
				timeSinceCharacterRemoved += Time.deltaTime;
			}
			if (!isFocused)
			{
				return;
			}
			string previousText = currentValue;
			if (Keyboard.current.ctrlKey.isPressed)
			{
				if (((ButtonControl)Keyboard.current.cKey).wasPressedThisFrame)
				{
					GUIUtility.systemCopyBuffer = currentValue;
				}
				else if (((ButtonControl)Keyboard.current.xKey).wasPressedThisFrame)
				{
					GUIUtility.systemCopyBuffer = currentValue;
					currentValue = null;
					timeSinceCharacterRemoved = 0f;
					MoveTMP(reset: true);
				}
				else if (((ButtonControl)Keyboard.current.vKey).wasPressedThisFrame)
				{
					currentValue += GUIUtility.systemCopyBuffer.Replace("\n", string.Empty);
					timeSinceCharacterAdded = 0f;
					if (IsTMPInMask())
					{
						MoveTMP(reset: true);
						return;
					}
					float num = 0f - inputTMP.GetPreferredValues(currentValue + "<b>|</b>").x;
					Rect rect = maskRectTransform.rect;
					MoveTMP(reset: true, num + ((Rect)(ref rect)).width - 6f);
				}
				return;
			}
			string inputString = Input.inputString;
			if (!(inputString == "\b"))
			{
				if (inputString == "\r")
				{
					pressedSubmit = true;
				}
				else if (!string.IsNullOrEmpty(inputString))
				{
					currentValue += inputString;
					timeSinceCharacterAdded = 0f;
					if (IsTMPInMask())
					{
						MoveTMP(reset: true);
					}
					else
					{
						MoveTMP(reset: false, 0f - CalculateTMPDifference(previousText, currentValue));
					}
				}
			}
			else if (currentValue.Length > 0)
			{
				currentValue = currentValue.Remove(currentValue.Length - 1, 1);
				timeSinceCharacterRemoved = 0f;
				if (IsTMPInMask())
				{
					MoveTMP(reset: true);
				}
				else
				{
					MoveTMP(reset: false, 0f - CalculateTMPDifference(previousText, currentValue));
				}
			}
		}

		private void UpdateColors()
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: 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_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			if (timeSinceCharacterAdded < 0.1f)
			{
				((Graphic)inputTMP).color = colors.characterAddedColor;
			}
			else if (timeSinceCharacterRemoved < 0.1f)
			{
				((Graphic)inputTMP).color = colors.characterRemovedColor;
			}
			else if (isHovering)
			{
				((Graphic)inputTMP).color = colors.hoverColor;
			}
			else if (isFocused)
			{
				((Graphic)inputTMP).color = colors.focusedColor;
			}
			else
			{
				((Graphic)inputTMP).color = (shouldUsePlaceholder ? colors.placeholderColor : colors.unfocusedColor);
			}
		}

		private void MoveTMP(bool reset, float moveBy = 0f)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			if (reset)
			{
				inputTMP.transform.localPosition = Vector3.zero;
			}
			if (moveBy != 0f)
			{
				Transform transform = inputTMP.transform;
				transform.localPosition += Vector3.right * moveBy;
			}
		}

		private float CalculateTMPDifference(string previousText, string newText)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			return inputTMP.GetPreferredValues(newText).x - inputTMP.GetPreferredValues(previousText).x;
		}

		private bool IsTMPInMask()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			float x = inputTMP.GetPreferredValues(currentValue).x;
			Rect rect = maskRectTransform.rect;
			return x < ((Rect)(ref rect)).width - 6f;
		}
	}
	public sealed class REPOLabel : REPOElement
	{
		public TextMeshProUGUI labelTMP;

		private void Awake()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Expected O, but got Unknown
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: 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_00ae: Unknown result type (might be due to invalid IL or missing references)
			base.rectTransform = (RectTransform)((Component)this).transform;
			labelTMP = ((Component)this).GetComponentInChildren<TextMeshProUGUI>();
			Vector2 sizeDelta = (((TMP_Text)labelTMP).rectTransform.pivot = (base.rectTransform.pivot = Vector2.zero));
			RectTransform obj = ((TMP_Text)labelTMP).rectTransform;
			RectTransform obj2 = base.rectTransform;
			((Vector2)(ref sizeDelta))..ctor(200f, 30f);
			obj2.sizeDelta = sizeDelta;
			obj.sizeDelta = sizeDelta;
			((TMP_Text)labelTMP).fontSize = 30f;
			TextMeshProUGUI obj3 = labelTMP;
			bool enableWordWrapping = (((TMP_Text)labelTMP).enableAutoSizing = false);
			((TMP_Text)obj3).enableWordWrapping = enableWordWrapping;
			((TMP_Text)labelTMP).alignment = (TextAlignmentOptions)513;
			((TMP_Text)labelTMP).margin = Vector4.zero;
		}

		private void Start()
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			((Transform)((TMP_Text)labelTMP).rectTransform).localPosition = Vector2.op_Implicit(Vector2.zero);
		}
	}
	public sealed class REPOObjectPreview : REPOElement
	{
		private PlayerAvatarMenuHover playerAvatarMenuHover;

		private Image backgroundImage;

		private RectTransform renderTextureRectTransform;

		private GameObject _previewObject;

		public GameObject previewObject
		{
			get
			{
				return _previewObject;
			}
			set
			{
				if (!((Object)(object)_previewObject == (Object)(object)value))
				{
					UpdatePreviewGameObject(value);
					_previewObject = value;
				}
			}
		}

		public bool enableBackgroundImage
		{
			get
			{
				return ((Behaviour)backgroundImage).enabled;
			}
			set
			{
				((Behaviour)backgroundImage).enabled = value;
			}
		}

		public Color backgroundImageColor
		{
			get
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				return ((Graphic)backgroundImage).color;
			}
			set
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				((Graphic)backgroundImage).color = value;
			}
		}

		public Vector2 previewSize
		{
			get
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				return base.rectTransform.sizeDelta;
			}
			set
			{
				//IL_0000: Unknown result type (might be due to invalid IL or missing references)
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				//IL_0028: Unknown result type (might be due to invalid IL or missing references)
				//IL_0029: Unknown result type (might be due to invalid IL or missing references)
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				//IL_003d: Unknown result type (might be due to invalid IL or missing references)
				//IL_003e: Unknown result type (might be due to invalid IL or missing references)
				//IL_000e: Unknown result type (might be due to invalid IL or missing references)
				//IL_000f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0012: Unknown result type (might be due to invalid IL or missing references)
				//IL_0023: Unknown result type (might be due to invalid IL or missing references)
				//IL_0024: Unknown result type (might be due to invalid IL or missing references)
				//IL_004c: Unknown result type (might be due to invalid IL or missing references)
				//IL_004d: Unknown result type (might be due to invalid IL or missing references)
				//IL_004e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0054: Unknown result type (might be due to invalid IL or missing references)
				//IL_0060: Unknown result type (might be due to invalid IL or missing references)
				Vector2 val;
				if (value.x > value.y)
				{
					val = value;
					val.y = value.x / (8f / 15f);
					value = val;
				}
				else
				{
					val = value;
					val.x = value.y * (8f / 15f);
					value = val;
				}
				RectTransform obj = renderTextureRectTransform;
				val = (base.rectTransform.sizeDelta = value);
				obj.sizeDelta = val;
				((Transform)renderTextureRectTransform).localPosition = Vector3.zero;
			}
		}

		private void Awake()
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Expected O, but got Unknown
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			base.rectTransform = ((Component)this).gameObject.AddComponent<RectTransform>();
			base.rectTransform.pivot = Vector2.right;
			RectTransform obj = base.rectTransform;
			Vector2 anchorMin = (base.rectTransform.anchorMax = Vector2.zero);
			obj.anchorMin = anchorMin;
			renderTextureRectTransform = (RectTransform)((Transform)base.rectTransform).GetChild(1);
			((Transform)renderTextureRectTransform).localPosition = Vector3.zero;
			playerAvatarMenuHover = ((Component)this).GetComponentInChildren<PlayerAvatarMenuHover>();
			((Component)playerAvatarMenuHover.playerAvatarMenu.cameraAndStuff).GetComponentInChildren<Camera>().farClipPlane = 100f;
			backgroundImage = ((Component)this).gameObject.AddComponent<Image>();
			((Behaviour)backgroundImage).enabled = false;
		}

		private void Start()
		{
			Transform transform = ((Component)playerAvatarMenuHover.playerAvatarMenu).transform;
			for (int i = 0; i < 3; i++)
			{
				Object.Destroy((Object)(object)((Component)transform.GetChild(i)).gameObject);
			}
		}

		private void OnDestroy()
		{
			if (!Object.op_Implicit((Object)(object)playerAvatarMenuHover) || !Object.op_Implicit((Object)(object)playerAvatarMenuHover.playerAvatarMenu))
			{
				return;
			}
			PlayerAvatarMenu playerAvatarMenu = playerAvatarMenuHover.playerAvatarMenu;
			if (Object.op_Implicit((Object)(object)playerAvatarMenu))
			{
				Transform cameraAndStuff = playerAvatarMenu.cameraAndStuff;
				if (Object.op_Implicit((Object)(object)cameraAndStuff))
				{
					Object.Destroy((Object)(object)((Component)cameraAndStuff).gameObject);
				}
				Object.Destroy((Object)(object)((Component)playerAvatarMenu).gameObject);
			}
		}

		private void UpdatePreviewGameObject(GameObject previewGameObject)
		{
			if (Object.op_Implicit((Object)(object)previewObject))
			{
				Object.Destroy((Object)(object)previewObject);
			}
			previewGameObject.transform.SetParent(((Component)playerAvatarMenuHover.playerAvatarMenu).transform, false);
			Rigidbody component = previewGameObject.GetComponent<Rigidbody>();
			if (component != null)
			{
				component.automaticInertiaTensor = false;
			}
		}
	}
	public sealed class REPOPopupPage : MonoBehaviour
	{
		public enum PresetSide
		{
			Left,
			Right
		}

		public delegate RectTransform ScrollViewBuilderDelegate(Transform scrollView);

		public delegate bool ShouldCloseMenuDelegate();

		public RectTransform rectTransform;

		public RectTransform maskRectTransform;

		public RectTransform scrollBarRectTransform;

		public MenuPage menuPage;

		public TextMeshProUGUI headerTMP;

		public MenuScrollBox menuScrollBox;

		public REPOScrollView scrollView;

		[Obsolete("Use onEscapePressed instead.")]
		public bool closeMenuOnEscape = true;

		public ShouldCloseMenuDelegate onEscapePressed;

		internal bool pageWasActivatedOnce;

		private GameObject pageDimmerGameObject;

		private RawImage pageDimmerRawImage;

		private RectTransform scrollBarFillRectTransform;

		private RectTransform scrollBarOutlineRectTransform;

		private Vector2 defaultMaskSizeDelta;

		private Vector2 defaultMaskPosition;

		private Padding _maskPadding;

		public bool pageDimmerVisibility
		{
			get
			{
				return pageDimmerGameObject.gameObject.activeSelf;
			}
			set
			{
				pageDimmerGameObject.gameObject.SetActive(value);
			}
		}

		public bool isCachedPage { get; internal set; }

		public float pageDimmerOpacity
		{
			get
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				return ((Graphic)pageDimmerRawImage).color.a;
			}
			set
			{
				//IL_000c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				//IL_001a: Unknown result type (might be due to invalid IL or missing references)
				RawImage obj = pageDimmerRawImage;
				Color color = ((Graphic)pageDimmerRawImage).color;
				color.a = value;
				((Graphic)obj).color = color;
			}
		}

		public Padding maskPadding
		{
			get
			{
				return _maskPadding;
			}
			set
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Unknown result type (might be due to invalid IL or missing references)
				//IL_000d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0080: Unknown result type (might be due to invalid IL or missing references)
				//IL_008c: Unknown result type (might be due to invalid IL or missing references)
				//IL_008d: Unknown result type (might be due to invalid IL or missing references)
				Vector2 sizeDelta = defaultMaskSizeDelta;
				Vector2 val = defaultMaskPosition;
				sizeDelta.x -= value.left + value.right;
				sizeDelta.y -= value.top + value.bottom;
				if (value.left != 0f)
				{
					val.x += value.left;
				}
				if (value.bottom != 0f)
				{
					val.y += value.bottom;
				}
				maskRectTransform.sizeDelta = sizeDelta;
				((Transform)maskRectTransform).localPosition = Vector2.op_Implicit(val);
				_maskPadding = value;
				UpdateScrollBarPosition();
			}
		}

		public void OpenPage(bool openOnTop)
		{
			MenuAPI.OpenMenuPage(menuPage, openOnTop);
			pageWasActivatedOnce = true;
			scrollView.UpdateElements();
		}

		public void ClosePage(bool closePagesAddedOnTop)
		{
			MenuAPI.CloseMenuPage(menuPage, closePagesAddedOnTop);
		}

		public void AddElement(MenuAPI.BuilderDelegate builderDelegate)
		{
			builderDelegate?.Invoke(((Component)this).transform);
		}

		public void AddElement(RectTransform elementRectTransform, Vector2 localPosition = default(Vector2))
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			((Transform)elementRectTransform).SetParent(((Component)this).transform);
			((Transform)elementRectTransform).localPosition = Vector2.op_Implicit(localPosition);
		}

		public void AddElementToScrollView(ScrollViewBuilderDelegate scrollViewBuilderDelegate, float topPadding = 0f, float bottomPadding = 0f)
		{
			object obj;
			if (scrollViewBuilderDelegate == null)
			{
				obj = null;
			}
			else
			{
				RectTransform obj2 = scrollViewBuilderDelegate((Transform)(object)menuScrollBox.scroller);
				obj = ((obj2 != null) ? ((Component)obj2).gameObject.AddComponent<REPOScrollViewElement>() : null);
			}
			REPOScrollViewElement rEPOScrollViewElement = (REPOScrollViewElement)obj;
			if (rEPOScrollViewElement != null)
			{
				rEPOScrollViewElement.onSettingChanged = scrollView.UpdateElements;
				rEPOScrollViewElement.topPadding = topPadding;
				rEPOScrollViewElement.bottomPadding = bottomPadding;
			}
		}

		public void AddElementToScrollView(RectTransform elementRectTransform, Vector2 localPosition = default(Vector2), float topPadding = 0f, float bottomPadding = 0f)
		{
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			REPOScrollViewElement rEPOScrollViewElement = ((Component)elementRectTransform).gameObject.AddComponent<REPOScrollViewElement>();
			if (rEPOScrollViewElement != null)
			{
				rEPOScrollViewElement.onSettingChanged = scrollView.UpdateElements;
				((Transform)elementRectTransform).SetParent((Transform)(object)menuScrollBox.scroller);
				((Transform)elementRectTransform).localPosition = Vector2.op_Implicit(localPosition);
				rEPOScrollViewElement.topPadding = topPadding;
				rEPOScrollViewElement.bottomPadding = bottomPadding;
			}
		}

		private void Awake()
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			//IL_00f1: 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_0152: Expected O, but got Unknown
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0174: Unknown result type (might be due to invalid IL or missing references)
			//IL_018a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01af: Expected O, but got Unknown
			//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Expected O, but got Unknown
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e5: Expected O, but got Unknown
			menuPage = ((Component)this).GetComponent<MenuPage>();
			headerTMP = ((Component)this).GetComponentInChildren<TextMeshProUGUI>();
			menuScrollBox = ((Component)this).GetComponentInChildren<MenuScrollBox>();
			rectTransform = (RectTransform)new GameObject("Page Content", new Type[1] { typeof(RectTransform) }).transform;
			((Transform)rectTransform).SetParent(((Component)this).transform);
			((Component)this).transform.Find("Panel").SetParent((Transform)(object)rectTransform);
			((TMP_Text)headerTMP).transform.parent.SetParent((Transform)(object)rectTransform);
			((Component)menuScrollBox).transform.SetParent((Transform)(object)rectTransform);
			pageDimmerGameObject = ((Component)Object.Instantiate<RectTransform>(REPOTemplates.pageDimmerTemplate, ((Component)this).transform)).gameObject;
			pageDimmerGameObject.transform.SetAsFirstSibling();
			pageDimmerRawImage = pageDimmerGameObject.GetComponentInChildren<RawImage>();
			menuPage.menuPageIndex = (MenuPageIndex)(-1);
			RectTransform scroller = menuScrollBox.scroller;
			for (int i = 2; i < ((Transform)scroller).childCount; i++)
			{
				Object.Destroy((Object)(object)((Component)((Transform)scroller).GetChild(i)).gameObject);
			}
			scrollView = ((Component)scroller).gameObject.AddComponent<REPOScrollView>();
			scrollView.popupPage = this;
			maskRectTransform = (RectTransform)((Transform)scroller).parent;
			defaultMaskSizeDelta = maskRectTransform.sizeDelta;
			defaultMaskPosition = Vector2.op_Implicit(((Transform)maskRectTransform).localPosition);
			menuScrollBox.scroller.sizeDelta = maskRectTransform.sizeDelta;
			scrollBarRectTransform = (RectTransform)menuScrollBox.scrollBar.transform;
			scrollBarFillRectTransform = (RectTransform)((Transform)scrollBarRectTransform).Find("Scroll Bar Bg (2)");
			scrollBarOutlineRectTransform = (RectTransform)((Transform)scrollBarRectTransform).Find("Scroll Bar Bg (1)");
			maskPadding = new Padding(0f, 0f, 0f, 25f);
			Object.Destroy((Object)(object)((Component)this).GetComponent<MenuPageSettingsPage>());
			MenuAPI.customMenuPages.Add(menuPage, this);
		}

		private void Start()
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			REPOReflection.menuScrollBox_ScrollerEndPosition.SetValue(menuScrollBox, 0);
			RectTransform scroller = menuScrollBox.scroller;
			Vector3 localPosition = ((Transform)menuScrollBox.scroller).localPosition;
			localPosition.y = 0f;
			((Transform)scroller).localPosition = localPosition;
			REPOReflection.menuPage_ScrollBoxes.SetValue(menuPage, 2);
			if (!pageWasActivatedOnce)
			{
				menuPage.PageStateSet((PageState)2);
			}
			scrollView.SetScrollPosition(0f);
		}

		private void Update()
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Invalid comparison between Unknown and I4
			if (closeMenuOnEscape)
			{
				PageState val = (PageState)REPOReflection.menuPage_CurrentPageState.GetValue(menuPage);
				if (SemiFunc.InputDown((InputKey)18) && (int)val != 2 && (onEscapePressed == null || onEscapePressed()))
				{
					ClosePage(closePagesAddedOnTop: false);
				}
			}
		}

		private void OnDestroy()
		{
			MenuAPI.customMenuPages.Remove(menuPage);
		}

		private void UpdateScrollBarPosition()
		{
			//IL_001a: 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_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)scrollBarRectTransform))
			{
				RectTransform obj = scrollBarRectTransform;
				Vector3 localPosition = ((Transform)scrollBarRectTransform).localPosition;
				localPosition.y = ((Transform)maskRectTransform).localPosition.y;
				((Transform)obj).localPosition = localPosition;
				Vector2 sizeDelta = scrollBarRectTransform.sizeDelta;
				sizeDelta.y = maskRectTransform.sizeDelta.y;
				RectTransform scrollBarBackground = menuScrollBox.scrollBarBackground;
				RectTransform obj2 = scrollBarFillRectTransform;
				Vector2 val2 = (scrollBarRectTransform.sizeDelta = sizeDelta);
				Vector2 sizeDelta2 = (obj2.sizeDelta = val2);
				scrollBarBackground.sizeDelta = sizeDelta2;
				scrollBarOutlineRectTransform.sizeDelta = sizeDelta + new Vector2(4f, 4f);
			}
		}
	}
	public sealed class REPOScrollView : MonoBehaviour
	{
		public REPOPopupPage popupPage;

		public float? scrollSpeed;

		private REPOScrollViewElement[] scrollViewElements = Array.Empty<REPOScrollViewElement>();

		private float _spacing;

		public float spacing
		{
			get
			{
				return _spacing;
			}
			set
			{
				if (!(Math.Abs(_spacing - value) < float.Epsilon))
				{
					_spacing = value;
					UpdateElements();
				}
			}
		}

		public void UpdateElements()
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0162: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_0176: 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_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			scrollViewElements = ((Component)this).GetComponentsInChildren<REPOScrollViewElement>(true);
			float num = 0f;
			float num2 = popupPage.maskRectTransform.sizeDelta.y;
			REPOScrollViewElement[] array = scrollViewElements;
			Rect rect;
			foreach (REPOScrollViewElement rEPOScrollViewElement in array)
			{
				if (rEPOScrollViewElement.visibility)
				{
					Vector3 localPosition = ((Transform)rEPOScrollViewElement.rectTransform).localPosition;
					num2 -= rEPOScrollViewElement.topPadding;
					float num3 = num2;
					rect = rEPOScrollViewElement.rectTransform.rect;
					num2 = num3 - ((Rect)(ref rect)).height;
					num = (localPosition.y = num2);
					num2 -= rEPOScrollViewElement.bottomPadding;
					num2 -= spacing;
					((Transform)rEPOScrollViewElement.rectTransform).localPosition = localPosition;
				}
			}
			GameObject gameObject = ((Component)popupPage.scrollBarRectTransform).gameObject;
			MenuScrollBox menuScrollBox = popupPage.menuScrollBox;
			RectTransform scroller = menuScrollBox.scroller;
			float num4 = num;
			if (!(num4 < 0f))
			{
				if (num4 >= 0f && gameObject.activeSelf)
				{
					((Component)popupPage.scrollBarRectTransform).gameObject.SetActive(false);
					Vector3 localPosition2 = ((Transform)scroller).localPosition;
					localPosition2.y = 0f;
					((Transform)scroller).localPosition = localPosition2;
				}
			}
			else if (!gameObject.activeSelf)
			{
				((Component)popupPage.scrollBarRectTransform).gameObject.SetActive(true);
			}
			FieldInfo menuScrollBox_ScrollerStartPosition = REPOReflection.menuScrollBox_ScrollerStartPosition;
			float num5 = num;
			rect = menuScrollBox.scrollHandle.rect;
			float height = ((Rect)(ref rect)).height;
			rect = menuScrollBox.scrollBarBackground.rect;
			menuScrollBox_ScrollerStartPosition.SetValue(menuScrollBox, Math.Abs(num5 / (1f - height / ((Rect)(ref rect)).height)));
		}

		public void SetScrollPosition(float normalizedPosition)
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			normalizedPosition = Mathf.Clamp(1f - normalizedPosition, 0f, 1f);
			Rect rect = popupPage.menuScrollBox.scrollBarBackground.rect;
			float height = ((Rect)(ref rect)).height;
			float num = normalizedPosition * height;
			float num2 = popupPage.menuScrollBox.scrollHandle.sizeDelta.y / 2f;
			if (num < num2)
			{
				num = num2;
			}
			else if (num > height - num2)
			{
				num = height - num2;
			}
			REPOReflection.menuScrollBox_ScrollHandleTargetPosition.SetValue(popupPage.menuScrollBox, num);
		}

		private void OnTransformChildrenChanged()
		{
			UpdateElements();
		}

		private void Update()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			RectTransform maskRectTransform = popupPage.maskRectTransform;
			REPOScrollViewElement[] array = scrollViewElements;
			foreach (REPOScrollViewElement rEPOScrollViewElement in array)
			{
				if (!rEPOScrollViewElement.visibility)
				{
					continue;
				}
				Vector3 position = ((Component)rEPOScrollViewElement).transform.position;
				bool num = position.y <= ((Transform)maskRectTransform).position.y + maskRectTransform.sizeDelta.y + 50f && position.y >= ((Transform)maskRectTransform).position.y - 50f;
				GameObject gameObject = ((Component)rEPOScrollViewElement).gameObject;
				if (!num)
				{
					if (gameObject.activeSelf)
					{
						gameObject.SetActive(false);
					}
				}
				else if (!gameObject.activeSelf)
				{
					gameObject.SetActive(true);
				}
			}
		}
	}
	public sealed class REPOScrollViewElement : MonoBehaviour
	{
		public RectTransform rectTransform;

		internal Action onSettingChanged;

		private bool _visibility = true;

		private float _topPadding;

		private float _bottomPadding;

		public float topPadding
		{
			get
			{
				return _topPadding;
			}
			set
			{
				if (!(Math.Abs(_topPadding - value) < float.Epsilon))
				{
					_topPadding = value;
					onSettingChanged?.Invoke();
				}
			}
		}

		public float bottomPadding
		{
			get
			{
				return _bottomPadding;
			}
			set
			{
				if (!(Math.Abs(_bottomPadding - value) < float.Epsilon))
				{
					_bottomPadding = value;
					onSettingChanged?.Invoke();
				}
			}
		}

		public bool visibility
		{
			get
			{
				return _visibility;
			}
			set
			{
				if (_visibility != value)
				{
					_visibility = value;
					((Component)this).gameObject.SetActive(value);
					onSettingChanged?.Invoke();
				}
			}
		}

		private void Awake()
		{
			ref RectTransform reference = ref rectTransform;
			Transform transform = ((Component)this).transform;
			reference = (RectTransform)(object)((transform is RectTransform) ? transform : null);
		}

		private void OnRectTransformDimensionsChange()
		{
			onSettingChanged?.Invoke();
		}
	}
	public sealed class REPOSlider : REPOElement
	{
		public enum BarBehavior
		{
			UpdateWithValue,
			StaticAtMinimum,
			StaticAtMaximum
		}

		public TextMeshProUGUI labelTMP;

		public TextMeshProUGUI descriptionTMP;

		public REPOTextScroller repoTextScroller;

		public Action<float> onValueChanged;

		public BarBehavior barBehavior;

		public float value;

		public string prefix;

		public string postfix;

		private RectTransform barRectTransform;

		private RectTransform barSizeRectTransform;

		private RectTransform barPointerRectTransform;

		private RectTransform barMaskRectTransform;

		private RectTransform sliderBackgroundRectTransform;

		private RectTransform backgroundFillRectTransform;

		private RectTransform backgroundOutlineRectTransform;

		private TextMeshProUGUI valueTMP;

		private TextMeshProUGUI maskedValueTMP;

		private MenuPage menuPage;

		private MenuSelectableElement menuSelectableElement;

		private float _min;

		private float _max = 1f;

		private float previousValue;

		private float _precisionDecimal = 0.01f;

		private int _precision = 2;

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

		private string currentDescription;

		private bool isHovering;

		public float min
		{
			get
			{
				string[] array = stringOptions;
				if (array == null || array.Length == 0)
				{
					return _min;
				}
				return 0f;
			}
			set
			{
				_min = value;
			}
		}

		public float max
		{
			get
			{
				string[] array = stringOptions;
				if (array == null || array.Length == 0)
				{
					return _max;
				}
				return stringOptions.Length - 1;
			}
			set
			{
				_max = value;
			}
		}

		public string[] stringOptions
		{
			get
			{
				return _stringOptions;
			}
			set
			{
				_stringOptions = value;
				UpdateBarText();
			}
		}

		public int precision
		{
			get
			{
				string[] array = stringOptions;
				if (array == null || array.Length == 0)
				{
					return _precision;
				}
				return 0;
			}
			set
			{
				precisionDecimal = ((value == 0) ? 1f : Mathf.Pow(10f, (float)(-value)));
				_precision = value;
			}
		}

		public float precisionDecimal
		{
			get
			{
				string[] array = stringOptions;
				if (array == null || array.Length == 0)
				{
					return _precisionDecimal;
				}
				return 1f;
			}
			set
			{
				_precisionDecimal = value;
			}
		}

		private float normalizedValue => (value - min) / (max - min);

		private bool hasValueChanged => Math.Abs(value - previousValue) > float.Epsilon;

		public void SetValue(float newValue, bool invokeCallback)
		{
			newValue = Mathf.Clam

plugins/MoreHead.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using MenuLib;
using Microsoft.CodeAnalysis;
using MoreHead;
using Photon.Pun;
using UnityEngine;
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 = "")]
[assembly: AssemblyCompany("MoreHead")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("MoreHead")]
[assembly: AssemblyTitle("MoreHead")]
[assembly: AssemblyVersion("1.0.0.0")]
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;
		}
	}
}
[BepInPlugin("Mhz.REPOMoreHead", "MoreHead", "1.0.0")]
public class Morehead : BaseUnityPlugin
{
	public static ManualLogSource? Logger;

	public static Morehead? Instance { get; private set; }

	private void Awake()
	{
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Expected O, but got Unknown
		Instance = this;
		Logger = ((BaseUnityPlugin)this).Logger;
		try
		{
			Harmony val = new Harmony("Mhz.REPOMoreHead");
			val.PatchAll(typeof(PlayerAvatarVisualsPatch));
			val.PatchAll(typeof(PlayerUpdatePatch));
			val.PatchAll(typeof(PlayerAvatarAwakePatch));
			val.PatchAll(typeof(MenuPlayerVisualsPatch));
			val.PatchAll(typeof(GameDirectorUpdatePatch));
			val.PatchAll(typeof(PlayerRevivePatch));
			Logger.LogInfo((object)"MoreHead 已加载");
			HeadDecorationManager.Initialize();
			ConfigManager.Initialize();
			MoreHeadUI.Initialize();
		}
		catch (Exception ex)
		{
			Logger.LogError((object)("Harmony补丁应用失败: " + ex.Message));
		}
	}

	private void OnApplicationQuit()
	{
		ConfigManager.SaveConfig();
	}

	public static bool GetDecorationState(string? name)
	{
		return HeadDecorationManager.GetDecorationState(name);
	}
}
[HarmonyPatch(typeof(PlayerAvatar))]
[HarmonyPatch("Update")]
internal class PlayerUpdatePatch
{
	private static void Postfix(PlayerAvatar __instance)
	{
		if (__instance.photonView.IsMine && GameManager.Multiplayer() && PhotonNetwork.LocalPlayer != null)
		{
		}
	}

	public static void UpdatePlayerDecorations(PlayerAvatar playerAvatar)
	{
		//IL_012f: 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_0155: Unknown result type (might be due to invalid IL or missing references)
		//IL_0162: Unknown result type (might be due to invalid IL or missing references)
		try
		{
			if ((Object)(object)playerAvatar?.playerAvatarVisuals == (Object)null)
			{
				return;
			}
			Dictionary<string, Transform> dictionary = new Dictionary<string, Transform>();
			Transform val = ((Component)playerAvatar.playerAvatarVisuals).transform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side/_____________________________________/ANIM HEAD TOP/code_head_top");
			if ((Object)(object)val != (Object)null)
			{
				dictionary["head"] = val;
			}
			Transform val2 = ((Component)playerAvatar.playerAvatarVisuals).transform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side");
			if ((Object)(object)val2 != (Object)null)
			{
				dictionary["neck"] = val2;
			}
			Transform val3 = ((Component)playerAvatar.playerAvatarVisuals).transform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side");
			if ((Object)(object)val3 != (Object)null)
			{
				dictionary["body"] = val3;
			}
			if (dictionary.Count == 0)
			{
				ManualLogSource? logger = Morehead.Logger;
				if (logger != null)
				{
					logger.LogWarning((object)"找不到任何装饰物父级节点");
				}
				return;
			}
			foreach (KeyValuePair<string, Transform> item in dictionary)
			{
				string key = item.Key;
				Transform value = item.Value;
				Transform val4 = value.Find("HeadDecorations");
				if ((Object)(object)val4 == (Object)null)
				{
					val4 = new GameObject("HeadDecorations").transform;
					val4.SetParent(value, false);
					val4.localPosition = Vector3.zero;
					val4.localRotation = Quaternion.identity;
					val4.localScale = Vector3.one;
				}
			}
			foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
			{
				if (dictionary.TryGetValue(decoration.ParentTag, out var value2))
				{
					Transform val5 = value2.Find("HeadDecorations");
					if ((Object)(object)val5 != (Object)null)
					{
						UpdateDecoration(val5, decoration.Name, decoration.IsVisible);
					}
				}
				else
				{
					ManualLogSource? logger2 = Morehead.Logger;
					if (logger2 != null)
					{
						logger2.LogWarning((object)("找不到装饰物 " + decoration.DisplayName + " 的父级节点: " + decoration.ParentTag));
					}
				}
			}
		}
		catch (Exception ex)
		{
			ManualLogSource? logger3 = Morehead.Logger;
			if (logger3 != null)
			{
				logger3.LogError((object)("更新装饰物状态失败: " + ex.Message));
			}
		}
	}

	private static void UpdateDecoration(Transform parent, string? decorationName, bool showDecoration)
	{
		Transform val = parent.Find(decorationName);
		if ((Object)(object)val != (Object)null)
		{
			((Component)val).gameObject.SetActive(showDecoration);
		}
	}

	public static void UpdateMenuPlayerDecorations()
	{
		//IL_011f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0138: Unknown result type (might be due to invalid IL or missing references)
		//IL_0145: Unknown result type (might be due to invalid IL or missing references)
		//IL_0152: Unknown result type (might be due to invalid IL or missing references)
		try
		{
			PlayerAvatarVisuals val = FindMenuPlayerVisuals();
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			Dictionary<string, Transform> dictionary = new Dictionary<string, Transform>();
			Transform val2 = ((Component)val).transform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side/_____________________________________/ANIM HEAD TOP/code_head_top");
			if ((Object)(object)val2 != (Object)null)
			{
				dictionary["head"] = val2;
			}
			Transform val3 = ((Component)val).transform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side");
			if ((Object)(object)val3 != (Object)null)
			{
				dictionary["neck"] = val3;
			}
			Transform val4 = ((Component)val).transform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side");
			if ((Object)(object)val4 != (Object)null)
			{
				dictionary["body"] = val4;
			}
			if (dictionary.Count == 0)
			{
				ManualLogSource? logger = Morehead.Logger;
				if (logger != null)
				{
					logger.LogWarning((object)"找不到任何菜单角色装饰物父级节点");
				}
				return;
			}
			foreach (KeyValuePair<string, Transform> item in dictionary)
			{
				string key = item.Key;
				Transform value = item.Value;
				Transform val5 = value.Find("HeadDecorations");
				if ((Object)(object)val5 == (Object)null)
				{
					val5 = new GameObject("HeadDecorations").transform;
					val5.SetParent(value, false);
					val5.localPosition = Vector3.zero;
					val5.localRotation = Quaternion.identity;
					val5.localScale = Vector3.one;
				}
			}
			foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
			{
				if (dictionary.TryGetValue(decoration.ParentTag, out var value2))
				{
					Transform val6 = value2.Find("HeadDecorations");
					if ((Object)(object)val6 != (Object)null)
					{
						Transform val7 = val6.Find(decoration.Name);
						if ((Object)(object)val7 == (Object)null)
						{
							AddMenuDecoration(val6, decoration.Name);
						}
						else
						{
							((Component)val7).gameObject.SetActive(decoration.IsVisible);
						}
					}
				}
				else
				{
					ManualLogSource? logger2 = Morehead.Logger;
					if (logger2 != null)
					{
						logger2.LogWarning((object)("找不到菜单角色装饰物 " + decoration.DisplayName + " 的父级节点: " + decoration.ParentTag));
					}
				}
			}
		}
		catch (Exception ex)
		{
			ManualLogSource? logger3 = Morehead.Logger;
			if (logger3 != null)
			{
				logger3.LogError((object)("更新菜单角色装饰物状态失败: " + ex.Message));
			}
		}
	}

	private static PlayerAvatarVisuals? FindMenuPlayerVisuals()
	{
		GameObject val = GameObject.Find("PlayerAvatarMenu");
		if ((Object)(object)val == (Object)null)
		{
			return null;
		}
		return val.GetComponentInChildren<PlayerAvatarVisuals>();
	}

	public static void AddMenuDecoration(Transform parent, string? decorationName)
	{
		string decorationName2 = decorationName;
		try
		{
			Transform val = parent.Find(decorationName2);
			if ((Object)(object)val != (Object)null)
			{
				bool decorationState = Morehead.GetDecorationState(decorationName2);
				((Component)val).gameObject.SetActive(decorationState);
				return;
			}
			DecorationInfo decorationInfo = HeadDecorationManager.Decorations.Find((DecorationInfo d) => d.Name != null && d.Name.Equals(decorationName2, StringComparison.OrdinalIgnoreCase));
			if (decorationInfo != null && (Object)(object)decorationInfo.Prefab != (Object)null)
			{
				GameObject val2 = Object.Instantiate<GameObject>(decorationInfo.Prefab, parent);
				((Object)val2).name = decorationName2;
				val2.SetActive(decorationInfo.IsVisible);
				return;
			}
			ManualLogSource? logger = Morehead.Logger;
			if (logger != null)
			{
				logger.LogWarning((object)("AddMenuDecoration: 找不到装饰物 " + decorationName2 + " 或其预制体为空"));
			}
		}
		catch (Exception ex)
		{
			ManualLogSource? logger2 = Morehead.Logger;
			if (logger2 != null)
			{
				logger2.LogError((object)("为菜单角色添加装饰物时出错: " + ex.Message));
			}
		}
	}
}
[HarmonyPatch(typeof(PlayerAvatar))]
[HarmonyPatch("Awake")]
internal class PlayerAvatarAwakePatch
{
	private static void Postfix(PlayerAvatar __instance)
	{
		((Component)__instance).gameObject.AddComponent<HeadDecorationSync>();
	}
}
public class HeadDecorationSync : MonoBehaviourPun
{
	public void SyncAllDecorations()
	{
		try
		{
			string[] array = new string[HeadDecorationManager.Decorations.Count];
			bool[] array2 = new bool[HeadDecorationManager.Decorations.Count];
			string[] array3 = new string[HeadDecorationManager.Decorations.Count];
			for (int i = 0; i < HeadDecorationManager.Decorations.Count; i++)
			{
				DecorationInfo decorationInfo = HeadDecorationManager.Decorations[i];
				array[i] = decorationInfo.Name;
				array2[i] = decorationInfo.IsVisible;
				array3[i] = decorationInfo.ParentTag;
			}
			((MonoBehaviourPun)this).photonView.RPC("UpdateAllDecorations", (RpcTarget)1, new object[3] { array, array2, array3 });
		}
		catch (Exception ex)
		{
			ManualLogSource? logger = Morehead.Logger;
			if (logger != null)
			{
				logger.LogError((object)("同步所有装饰物状态失败: " + ex.Message));
			}
		}
	}

	[PunRPC]
	private void UpdateAllDecorations(string[] names, bool[] states, string[] parentTags)
	{
		try
		{
			PlayerAvatar component = ((Component)this).GetComponent<PlayerAvatar>();
			if ((Object)(object)component == (Object)null || (Object)(object)component.playerAvatarVisuals == (Object)null)
			{
				ManualLogSource? logger = Morehead.Logger;
				if (logger != null)
				{
					logger.LogWarning((object)"找不到PlayerAvatar或PlayerAvatarVisuals组件");
				}
				return;
			}
			Dictionary<string, Transform> dictionary = new Dictionary<string, Transform>();
			Transform val = ((Component)component.playerAvatarVisuals).transform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side/_____________________________________/ANIM HEAD TOP/code_head_top");
			if ((Object)(object)val != (Object)null)
			{
				dictionary["head"] = val;
			}
			Transform val2 = ((Component)component.playerAvatarVisuals).transform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side");
			if ((Object)(object)val2 != (Object)null)
			{
				dictionary["neck"] = val2;
			}
			Transform val3 = ((Component)component.playerAvatarVisuals).transform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side");
			if ((Object)(object)val3 != (Object)null)
			{
				dictionary["body"] = val3;
			}
			for (int i = 0; i < names.Length; i++)
			{
				string decorationName = names[i];
				bool showDecoration = states[i];
				string key = parentTags[i];
				if (dictionary.TryGetValue(key, out var value))
				{
					Transform val4 = value.Find("HeadDecorations");
					if ((Object)(object)val4 != (Object)null)
					{
						UpdateDecoration(val4, decorationName, showDecoration);
					}
				}
			}
		}
		catch (Exception ex)
		{
			ManualLogSource? logger2 = Morehead.Logger;
			if (logger2 != null)
			{
				logger2.LogError((object)("RPC更新所有装饰物状态失败: " + ex.Message));
			}
		}
	}

	private void UpdateDecoration(Transform parent, string decorationName, bool showDecoration)
	{
		Transform val = parent.Find(decorationName);
		if ((Object)(object)val != (Object)null)
		{
			((Component)val).gameObject.SetActive(showDecoration);
		}
	}
}
[HarmonyPatch(typeof(PlayerAvatarVisuals))]
[HarmonyPatch("Start")]
internal class PlayerAvatarVisualsPatch
{
	private static void Postfix(PlayerAvatarVisuals __instance)
	{
		//IL_0103: Unknown result type (might be due to invalid IL or missing references)
		//IL_011c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0129: Unknown result type (might be due to invalid IL or missing references)
		//IL_0136: Unknown result type (might be due to invalid IL or missing references)
		try
		{
			Dictionary<string, Transform> dictionary = new Dictionary<string, Transform>();
			Transform val = ((Component)__instance).transform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side/_____________________________________/ANIM HEAD TOP/code_head_top");
			if ((Object)(object)val != (Object)null)
			{
				dictionary["head"] = val;
			}
			Transform val2 = ((Component)__instance).transform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side");
			if ((Object)(object)val2 != (Object)null)
			{
				dictionary["neck"] = val2;
			}
			Transform val3 = ((Component)__instance).transform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side");
			if ((Object)(object)val3 != (Object)null)
			{
				dictionary["body"] = val3;
			}
			if (dictionary.Count == 0)
			{
				ManualLogSource? logger = Morehead.Logger;
				if (logger != null)
				{
					logger.LogError((object)"找不到任何装饰物父级节点");
				}
				return;
			}
			foreach (KeyValuePair<string, Transform> item in dictionary)
			{
				string key = item.Key;
				Transform value = item.Value;
				Transform val4 = value.Find("HeadDecorations");
				if ((Object)(object)val4 == (Object)null)
				{
					val4 = new GameObject("HeadDecorations").transform;
					val4.SetParent(value, false);
					val4.localPosition = Vector3.zero;
					val4.localRotation = Quaternion.identity;
					val4.localScale = Vector3.one;
				}
			}
			foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
			{
				if (dictionary.TryGetValue(decoration.ParentTag, out var value2))
				{
					Transform val5 = value2.Find("HeadDecorations");
					if ((Object)(object)val5 != (Object)null)
					{
						AddNewDecoration(val5, decoration, __instance);
					}
				}
				else
				{
					ManualLogSource? logger2 = Morehead.Logger;
					if (logger2 != null)
					{
						logger2.LogWarning((object)("初始化时找不到装饰物 " + decoration.DisplayName + " 的父级节点: " + decoration.ParentTag));
					}
				}
			}
			if (!GameManager.Multiplayer() || !((Object)(object)__instance.playerAvatar != (Object)null) || !((Object)(object)__instance.playerAvatar.photonView != (Object)null) || !__instance.playerAvatar.photonView.IsMine)
			{
				return;
			}
			try
			{
				HeadDecorationSync component = ((Component)__instance.playerAvatar).GetComponent<HeadDecorationSync>();
				if ((Object)(object)component != (Object)null)
				{
					component.SyncAllDecorations();
					return;
				}
				ManualLogSource? logger3 = Morehead.Logger;
				if (logger3 != null)
				{
					logger3.LogWarning((object)"找不到HeadDecorationSync组件,无法同步初始状态");
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger4 = Morehead.Logger;
				if (logger4 != null)
				{
					logger4.LogError((object)("同步初始装饰物状态失败: " + ex.Message));
				}
			}
		}
		catch (Exception ex2)
		{
			ManualLogSource? logger5 = Morehead.Logger;
			if (logger5 != null)
			{
				logger5.LogError((object)("添加装饰物失败: " + ex2.Message));
			}
		}
	}

	private static void AddNewDecoration(Transform parent, DecorationInfo decoration, PlayerAvatarVisuals __instance)
	{
		Transform val = parent.Find(decoration.Name);
		if ((Object)(object)val != (Object)null)
		{
			((Component)val).gameObject.SetActive(decoration.IsVisible);
			return;
		}
		if ((Object)(object)decoration.Prefab != (Object)null)
		{
			try
			{
				GameObject val2 = Object.Instantiate<GameObject>(decoration.Prefab, parent);
				((Object)val2).name = decoration.Name;
				val2.SetActive(decoration.IsVisible);
				return;
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Morehead.Logger;
				if (logger != null)
				{
					logger.LogError((object)("实例化预制体时出错: " + ex.Message));
				}
				return;
			}
		}
		ManualLogSource? logger2 = Morehead.Logger;
		if (logger2 != null)
		{
			logger2.LogWarning((object)("AddNewDecoration: 装饰物 " + decoration.DisplayName + " 的预制体为空"));
		}
	}
}
[HarmonyPatch(typeof(PlayerAvatarVisuals))]
[HarmonyPatch("Start")]
internal class MenuPlayerVisualsPatch
{
	private static void Postfix(PlayerAvatarVisuals __instance)
	{
		//IL_011a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0133: Unknown result type (might be due to invalid IL or missing references)
		//IL_0140: Unknown result type (might be due to invalid IL or missing references)
		//IL_014d: Unknown result type (might be due to invalid IL or missing references)
		try
		{
			if (!__instance.isMenuAvatar)
			{
				return;
			}
			Dictionary<string, Transform> dictionary = new Dictionary<string, Transform>();
			Transform val = ((Component)__instance).transform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side/_____________________________________/ANIM HEAD TOP/code_head_top");
			if ((Object)(object)val != (Object)null)
			{
				dictionary["head"] = val;
			}
			Transform val2 = ((Component)__instance).transform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side");
			if ((Object)(object)val2 != (Object)null)
			{
				dictionary["neck"] = val2;
			}
			Transform val3 = ((Component)__instance).transform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side");
			if ((Object)(object)val3 != (Object)null)
			{
				dictionary["body"] = val3;
			}
			if (dictionary.Count == 0)
			{
				ManualLogSource? logger = Morehead.Logger;
				if (logger != null)
				{
					logger.LogWarning((object)"找不到任何菜单角色装饰物父级节点");
				}
				return;
			}
			foreach (KeyValuePair<string, Transform> item in dictionary)
			{
				string key = item.Key;
				Transform value = item.Value;
				Transform val4 = value.Find("HeadDecorations");
				if ((Object)(object)val4 == (Object)null)
				{
					val4 = new GameObject("HeadDecorations").transform;
					val4.SetParent(value, false);
					val4.localPosition = Vector3.zero;
					val4.localRotation = Quaternion.identity;
					val4.localScale = Vector3.one;
				}
				foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
				{
					if (decoration.ParentTag == key)
					{
						PlayerUpdatePatch.AddMenuDecoration(val4, decoration.Name);
					}
				}
			}
		}
		catch (Exception ex)
		{
			ManualLogSource? logger2 = Morehead.Logger;
			if (logger2 != null)
			{
				logger2.LogError((object)("初始化菜单角色装饰物失败: " + ex.Message));
			}
		}
	}
}
[HarmonyPatch(typeof(GameDirector))]
[HarmonyPatch("Update")]
internal class GameDirectorUpdatePatch
{
	private static gameState previousState;

	private static void Postfix(GameDirector __instance)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Invalid comparison between Unknown and I4
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Invalid comparison between Unknown and I4
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_0028: Unknown result type (might be due to invalid IL or missing references)
		try
		{
			if ((int)previousState != 2 && (int)__instance.currentState == 2)
			{
				SyncAllPlayersDecorations();
			}
			previousState = __instance.currentState;
		}
		catch (Exception ex)
		{
			ManualLogSource? logger = Morehead.Logger;
			if (logger != null)
			{
				logger.LogError((object)("监听游戏状态变化时出错: " + ex.Message));
			}
		}
	}

	private static void SyncAllPlayersDecorations()
	{
		try
		{
			PlayerAvatar val = FindLocalPlayer();
			if ((Object)(object)val != (Object)null)
			{
				PlayerUpdatePatch.UpdatePlayerDecorations(val);
				HeadDecorationSync component = ((Component)val).GetComponent<HeadDecorationSync>();
				if ((Object)(object)component != (Object)null)
				{
					component.SyncAllDecorations();
				}
			}
		}
		catch (Exception ex)
		{
			ManualLogSource? logger = Morehead.Logger;
			if (logger != null)
			{
				logger.LogError((object)("同步所有玩家装饰物状态时出错: " + ex.Message));
			}
		}
	}

	private static PlayerAvatar? FindLocalPlayer()
	{
		try
		{
			PlayerAvatar[] array = Object.FindObjectsOfType<PlayerAvatar>();
			PlayerAvatar[] array2 = array;
			foreach (PlayerAvatar val in array2)
			{
				if ((Object)(object)val?.photonView != (Object)null && val.photonView.IsMine)
				{
					return val;
				}
			}
		}
		catch (Exception ex)
		{
			ManualLogSource? logger = Morehead.Logger;
			if (logger != null)
			{
				logger.LogError((object)("查找本地玩家时出错: " + ex.Message));
			}
		}
		return null;
	}
}
[HarmonyPatch(typeof(PlayerAvatar))]
[HarmonyPatch("ReviveRPC")]
internal class PlayerRevivePatch
{
	private static void Postfix(PlayerAvatar __instance)
	{
		try
		{
			if (__instance.photonView.IsMine)
			{
				((MonoBehaviour)__instance).StartCoroutine(DelayedSync(__instance));
			}
		}
		catch (Exception ex)
		{
			ManualLogSource? logger = Morehead.Logger;
			if (logger != null)
			{
				logger.LogError((object)("玩家复活时同步装饰物状态失败: " + ex.Message));
			}
		}
	}

	private static IEnumerator DelayedSync(PlayerAvatar playerAvatar)
	{
		yield return null;
		yield return (object)new WaitForSeconds(0.2f);
		try
		{
			PlayerUpdatePatch.UpdatePlayerDecorations(playerAvatar);
		}
		catch (Exception e2)
		{
			ManualLogSource? logger = Morehead.Logger;
			if (logger != null)
			{
				logger.LogError((object)("更新玩家装饰物状态失败: " + e2.Message));
			}
		}
		yield return (object)new WaitForSeconds(0.1f);
		try
		{
			HeadDecorationSync syncComponent = ((Component)playerAvatar).GetComponent<HeadDecorationSync>();
			if ((Object)(object)syncComponent != (Object)null)
			{
				syncComponent.SyncAllDecorations();
				yield break;
			}
			ManualLogSource? logger2 = Morehead.Logger;
			if (logger2 != null)
			{
				logger2.LogWarning((object)"玩家复活后找不到HeadDecorationSync组件");
			}
		}
		catch (Exception e)
		{
			ManualLogSource? logger3 = Morehead.Logger;
			if (logger3 != null)
			{
				logger3.LogError((object)("同步装饰物状态失败: " + e.Message));
			}
		}
	}
}
namespace MoreHead
{
	public static class ConfigManager
	{
		private static Dictionary<string?, bool> _decorationStates = new Dictionary<string, bool>();

		private static ManualLogSource? Logger => Morehead.Logger;

		private static string ConfigFilePath
		{
			get
			{
				Morehead? instance = Morehead.Instance;
				return Path.Combine(Path.GetDirectoryName((instance != null) ? ((BaseUnityPlugin)instance).Info.Location : null) ?? string.Empty, "MoreHeadConfig.txt");
			}
		}

		public static void Initialize()
		{
			try
			{
				LoadConfig();
				ApplySavedStates();
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("初始化配置管理器时出错: " + ex.Message));
				}
			}
		}

		private static void LoadConfig()
		{
			try
			{
				_decorationStates.Clear();
				if (!File.Exists(ConfigFilePath))
				{
					return;
				}
				string[] array = File.ReadAllLines(ConfigFilePath);
				string[] array2 = array;
				foreach (string text in array2)
				{
					if (!string.IsNullOrWhiteSpace(text))
					{
						string[] array3 = text.Split('=');
						if (array3.Length == 2)
						{
							string key = array3[0].Trim();
							bool value = array3[1].Trim().Equals("1", StringComparison.OrdinalIgnoreCase);
							_decorationStates[key] = value;
						}
					}
				}
				if (_decorationStates.Count > 0)
				{
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogInfo((object)$"已加载配置,包含 {_decorationStates.Count} 个装饰物状态");
					}
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogError((object)("加载配置时出错: " + ex.Message));
				}
				_decorationStates.Clear();
			}
		}

		public static void SaveConfig()
		{
			try
			{
				UpdateConfigData();
				List<string> list = new List<string>();
				foreach (KeyValuePair<string, bool> decorationState in _decorationStates)
				{
					list.Add(decorationState.Key + "=" + (decorationState.Value ? "1" : "0"));
				}
				File.WriteAllLines(ConfigFilePath, list);
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("保存配置时出错: " + ex.Message));
				}
			}
		}

		private static void UpdateConfigData()
		{
			_decorationStates.Clear();
			foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
			{
				_decorationStates[decoration.Name] = decoration.IsVisible;
			}
		}

		private static void ApplySavedStates()
		{
			try
			{
				int num = 0;
				foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
				{
					if (_decorationStates.TryGetValue(decoration.Name, out var value))
					{
						decoration.IsVisible = value;
						num++;
					}
				}
				if (num > 0)
				{
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogInfo((object)$"已应用 {num} 个已保存的装饰物状态");
					}
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogError((object)("应用已保存的装饰物状态时出错: " + ex.Message));
				}
			}
		}
	}
	public class DecorationInfo
	{
		public string? Name { get; set; }

		public string? DisplayName { get; set; }

		public bool IsVisible { get; set; }

		public GameObject? Prefab { get; set; }

		public string? ParentTag { get; set; }

		public string? BundlePath { get; set; }
	}
	public static class HeadDecorationManager
	{
		private static Dictionary<string?, string> parentPathMap = new Dictionary<string, string>
		{
			{ "head", "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side/_____________________________________/ANIM HEAD TOP/code_head_top" },
			{ "neck", "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side" },
			{ "body", "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side" }
		};

		private static ManualLogSource? Logger => Morehead.Logger;

		public static List<DecorationInfo> Decorations { get; private set; } = new List<DecorationInfo>();


		public static void Initialize()
		{
			try
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogInfo((object)"正在初始化装饰物管理器...");
				}
				Decorations.Clear();
				LoadAllDecorations();
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogInfo((object)$"装饰物管理器初始化完成,共加载了 {Decorations.Count} 个装饰物");
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger3 = Logger;
				if (logger3 != null)
				{
					logger3.LogError((object)("初始化装饰物管理器时出错: " + ex.Message));
				}
			}
		}

		private static void LoadAllDecorations()
		{
			try
			{
				Morehead? instance = Morehead.Instance;
				string directoryName = Path.GetDirectoryName((instance != null) ? ((BaseUnityPlugin)instance).Info.Location : null);
				if (string.IsNullOrEmpty(directoryName))
				{
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogError((object)"无法获取MOD所在目录");
					}
					return;
				}
				string text = Path.Combine(directoryName, "Decorations");
				if (!Directory.Exists(text))
				{
					Directory.CreateDirectory(text);
					ManualLogSource? logger2 = Logger;
					if (logger2 != null)
					{
						logger2.LogInfo((object)("已创建装饰物目录: " + text));
					}
				}
				List<string> list = new List<string>();
				string[] files = Directory.GetFiles(text, "*.hhh");
				list.AddRange(files);
				try
				{
					string text2 = FindPluginsDirectory(directoryName);
					if (!string.IsNullOrEmpty(text2) && Directory.Exists(text2))
					{
						ManualLogSource? logger3 = Logger;
						if (logger3 != null)
						{
							logger3.LogInfo((object)("找到BepInEx/plugins目录: " + text2));
						}
						string[] files2 = Directory.GetFiles(text2, "*.hhh", SearchOption.AllDirectories);
						list.AddRange(files2);
						ManualLogSource? logger4 = Logger;
						if (logger4 != null)
						{
							logger4.LogInfo((object)$"在plugins目录中找到 {files2.Length} 个.hhh文件");
						}
					}
					else
					{
						ManualLogSource? logger5 = Logger;
						if (logger5 != null)
						{
							logger5.LogWarning((object)"无法找到BepInEx/plugins目录,将只加载本地装饰物");
						}
					}
				}
				catch (Exception ex)
				{
					ManualLogSource? logger6 = Logger;
					if (logger6 != null)
					{
						logger6.LogError((object)("搜索plugins目录时出错: " + ex.Message));
					}
				}
				list = list.Distinct().ToList();
				if (list.Count == 0)
				{
					ManualLogSource? logger7 = Logger;
					if (logger7 != null)
					{
						logger7.LogWarning((object)"未找到任何装饰物包文件,请确保.hhh文件已放置");
					}
				}
				else
				{
					ManualLogSource? logger8 = Logger;
					if (logger8 != null)
					{
						logger8.LogInfo((object)$"找到 {list.Count} 个装饰物包文件");
					}
					if (files.Length != 0)
					{
						ManualLogSource? logger9 = Logger;
						if (logger9 != null)
						{
							logger9.LogInfo((object)$"- Decorations目录: {files.Length} 个文件");
						}
					}
				}
				foreach (string item in list)
				{
					LoadDecorationBundle(item);
				}
			}
			catch (Exception ex2)
			{
				ManualLogSource? logger10 = Logger;
				if (logger10 != null)
				{
					logger10.LogError((object)("加载装饰物时出错: " + ex2.Message));
				}
			}
		}

		private static void LoadDecorationBundle(string bundlePath)
		{
			AssetBundle val = null;
			try
			{
				if (!File.Exists(bundlePath))
				{
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogWarning((object)("文件不存在: " + bundlePath));
					}
					return;
				}
				FileInfo fileInfo = new FileInfo(bundlePath);
				if (fileInfo.Length < 1024)
				{
					ManualLogSource? logger2 = Logger;
					if (logger2 != null)
					{
						logger2.LogWarning((object)$"文件过小,可能不是有效的AssetBundle: {bundlePath}, 大小: {fileInfo.Length} 字节");
					}
					return;
				}
				string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(bundlePath);
				string parentTag = "head";
				string text = fileNameWithoutExtension;
				if (fileNameWithoutExtension.Contains("_"))
				{
					string[] array = fileNameWithoutExtension.Split('_');
					if (array.Length >= 2)
					{
						string text2 = array[^1].ToLower();
						if (parentPathMap.ContainsKey(text2))
						{
							parentTag = text2;
							text = string.Join("_", array, 0, array.Length - 1);
						}
					}
				}
				string text3 = EnsureUniqueName(text);
				if (text3 != text)
				{
					ManualLogSource? logger3 = Logger;
					if (logger3 != null)
					{
						logger3.LogWarning((object)("检测到重名,将基础名称从 " + text + " 修改为 " + text3));
					}
					text = text3;
				}
				try
				{
					val = AssetBundle.LoadFromFile(bundlePath);
					if ((Object)(object)val == (Object)null)
					{
						ManualLogSource? logger4 = Logger;
						if (logger4 != null)
						{
							logger4.LogError((object)("无法加载AssetBundle,文件可能已损坏或不是有效的AssetBundle: " + bundlePath));
						}
						return;
					}
				}
				catch (Exception ex)
				{
					ManualLogSource? logger5 = Logger;
					if (logger5 != null)
					{
						logger5.LogError((object)("加载AssetBundle时出错,文件可能不是有效的AssetBundle: " + bundlePath + ", 错误: " + ex.Message));
					}
					return;
				}
				try
				{
					string[] allAssetNames;
					try
					{
						allAssetNames = val.GetAllAssetNames();
					}
					catch (Exception ex2)
					{
						ManualLogSource? logger6 = Logger;
						if (logger6 != null)
						{
							logger6.LogError((object)("获取AssetBundle资源名称时出错: " + bundlePath + ", 错误: " + ex2.Message));
						}
						val.Unload(true);
						return;
					}
					if (allAssetNames.Length == 0)
					{
						ManualLogSource? logger7 = Logger;
						if (logger7 != null)
						{
							logger7.LogWarning((object)("AssetBundle不包含任何资源: " + bundlePath));
						}
						val.Unload(true);
						return;
					}
					bool flag = false;
					GameObject val2 = null;
					string[] array2 = allAssetNames;
					foreach (string text4 in array2)
					{
						try
						{
							val2 = val.LoadAsset<GameObject>(text4);
							if ((Object)(object)val2 != (Object)null)
							{
								flag = true;
								break;
							}
						}
						catch (Exception ex3)
						{
							ManualLogSource? logger8 = Logger;
							if (logger8 != null)
							{
								logger8.LogWarning((object)("加载资源 " + text4 + " 时出错: " + ex3.Message));
							}
						}
					}
					if (!flag || (Object)(object)val2 == (Object)null)
					{
						ManualLogSource? logger9 = Logger;
						if (logger9 != null)
						{
							logger9.LogWarning((object)("AssetBundle不包含有效的GameObject资源: " + bundlePath));
						}
						val.Unload(true);
						return;
					}
					string text5 = ((Object)val2).name;
					string text6 = EnsureUniqueDisplayName(text5);
					if (text6 != text5)
					{
						ManualLogSource? logger10 = Logger;
						if (logger10 != null)
						{
							logger10.LogWarning((object)("检测到显示名称重复,将显示名称从 " + text5 + " 修改为 " + text6));
						}
						text5 = text6;
					}
					DecorationInfo decorationInfo = new DecorationInfo
					{
						Name = text,
						DisplayName = text5,
						IsVisible = false,
						Prefab = val2,
						ParentTag = parentTag,
						BundlePath = bundlePath
					};
					Decorations.Add(decorationInfo);
					ManualLogSource? logger11 = Logger;
					if (logger11 != null)
					{
						logger11.LogInfo((object)("成功加载装饰物: " + decorationInfo.DisplayName + ", 父级: " + decorationInfo.ParentTag));
					}
					val.Unload(false);
				}
				catch (Exception ex4)
				{
					ManualLogSource? logger12 = Logger;
					if (logger12 != null)
					{
						logger12.LogError((object)("处理AssetBundle时出错: " + ex4.Message));
					}
					if ((Object)(object)val != (Object)null)
					{
						val.Unload(true);
					}
				}
			}
			catch (Exception ex5)
			{
				ManualLogSource? logger13 = Logger;
				if (logger13 != null)
				{
					logger13.LogError((object)("加载装饰物包时出错: " + ex5.Message + ", 路径: " + bundlePath));
				}
				if ((Object)(object)val != (Object)null)
				{
					val.Unload(true);
				}
			}
		}

		private static string EnsureUniqueName(string baseName)
		{
			string name = baseName;
			int num = 1;
			while (Decorations.Any((DecorationInfo d) => d.Name != null && d.Name.Equals(name, StringComparison.OrdinalIgnoreCase)))
			{
				name = $"{baseName}({num})";
				num++;
			}
			return name;
		}

		private static string EnsureUniqueDisplayName(string baseDisplayName)
		{
			string displayName = baseDisplayName;
			int num = 1;
			while (Decorations.Any((DecorationInfo d) => d.DisplayName != null && d.DisplayName.Equals(displayName, StringComparison.OrdinalIgnoreCase)))
			{
				displayName = $"{baseDisplayName}({num})";
				num++;
			}
			return displayName;
		}

		private static string? GetParentTagFromPrefab(GameObject prefab)
		{
			string text = ((Object)prefab).name.ToLower();
			foreach (string key in parentPathMap.Keys)
			{
				if (key != null && text.Contains(key))
				{
					return key;
				}
			}
			return null;
		}

		public static bool GetDecorationState(string? name)
		{
			string name2 = name;
			DecorationInfo decorationInfo = Decorations.FirstOrDefault((DecorationInfo d) => d.Name != null && d.Name.Equals(name2, StringComparison.OrdinalIgnoreCase));
			if (decorationInfo == null)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogWarning((object)("GetDecorationState: 找不到装饰物 " + name2));
				}
			}
			return decorationInfo?.IsVisible ?? false;
		}

		public static void SetDecorationState(string name, bool isVisible)
		{
			string name2 = name;
			DecorationInfo decorationInfo = Decorations.FirstOrDefault((DecorationInfo d) => d.Name != null && d.Name.Equals(name2, StringComparison.OrdinalIgnoreCase));
			if (decorationInfo != null)
			{
				decorationInfo.IsVisible = isVisible;
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogInfo((object)$"设置装饰物 {decorationInfo.DisplayName} 显示状态为: {isVisible}");
				}
			}
			else
			{
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogWarning((object)("SetDecorationState: 找不到装饰物 " + name2));
				}
			}
		}

		public static bool ToggleDecorationState(string? name)
		{
			string name2 = name;
			DecorationInfo decorationInfo = Decorations.FirstOrDefault((DecorationInfo d) => d.Name != null && d.Name.Equals(name2, StringComparison.OrdinalIgnoreCase));
			if (decorationInfo != null)
			{
				decorationInfo.IsVisible = !decorationInfo.IsVisible;
				return decorationInfo.IsVisible;
			}
			ManualLogSource? logger = Logger;
			if (logger != null)
			{
				logger.LogWarning((object)("ToggleDecorationState: 找不到装饰物 " + name2));
			}
			return false;
		}

		public static string GetParentPath(string parentTag)
		{
			if (parentPathMap.TryGetValue(parentTag.ToLower(), out string value))
			{
				return value;
			}
			return parentPathMap["head"];
		}

		private static string? FindPluginsDirectory(string startDirectory)
		{
			try
			{
				string text = startDirectory;
				for (int i = 0; i < 5; i++)
				{
					string fileName = Path.GetFileName(text);
					if (string.Equals(fileName, "plugins", StringComparison.OrdinalIgnoreCase))
					{
						string directoryName = Path.GetDirectoryName(text);
						if (directoryName != null)
						{
							string fileName2 = Path.GetFileName(directoryName);
							if (string.Equals(fileName2, "BepInEx", StringComparison.OrdinalIgnoreCase))
							{
								return text;
							}
						}
					}
					string text2 = Path.Combine(text, "BepInEx", "plugins");
					if (Directory.Exists(text2))
					{
						return text2;
					}
					string directoryName2 = Path.GetDirectoryName(text);
					if (string.IsNullOrEmpty(directoryName2) || directoryName2 == text)
					{
						break;
					}
					text = directoryName2;
				}
				string pathRoot = Path.GetPathRoot(startDirectory);
				if (!string.IsNullOrEmpty(pathRoot))
				{
					string text3 = Path.Combine(pathRoot, "REPO", "BepInEx", "plugins");
					if (Directory.Exists(text3))
					{
						return text3;
					}
					string[] array = new string[4]
					{
						Path.Combine(pathRoot, "Program Files (x86)", "Steam", "steamapps", "common", "REPO"),
						Path.Combine(pathRoot, "Program Files", "Steam", "steamapps", "common", "REPO"),
						Path.Combine(pathRoot, "SteamLibrary", "steamapps", "common", "REPO"),
						Path.Combine(pathRoot, "Games", "REPO")
					};
					string[] array2 = array;
					foreach (string path in array2)
					{
						string text4 = Path.Combine(path, "BepInEx", "plugins");
						if (Directory.Exists(text4))
						{
							return text4;
						}
					}
				}
				return null;
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("查找plugins目录时出错: " + ex.Message));
				}
				return null;
			}
		}
	}
	public static class MoreHeadUI
	{
		private static REPOButton? menuButton;

		private static REPOPopupPage? decorationsPage;

		private static Dictionary<string?, REPOButton> decorationButtons = new Dictionary<string, REPOButton>();

		private const string BUTTON_NAME = "<color=#FF0000>M</color><color=#FF3300>O</color><color=#FF6600>R</color><color=#FF9900>E</color><color=#FFCC00>H</color><color=#FFDD00>E</color><color=#FFEE00>A</color><color=#FFFF00>D</color>";

		private const string PAGE_TITLE = "Rotate robot: A/D";

		private static ManualLogSource? Logger => Morehead.Logger;

		public static void Initialize()
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Expected O, but got Unknown
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Expected O, but got Unknown
			try
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogInfo((object)"正在初始化MoreHead UI...");
				}
				menuButton = new REPOButton("<color=#FF0000>M</color><color=#FF3300>O</color><color=#FF6600>R</color><color=#FF9900>E</color><color=#FFCC00>H</color><color=#FFDD00>E</color><color=#FFEE00>A</color><color=#FFFF00>D</color>", (Action)OnMenuButtonClick);
				MenuAPI.AddElementToEscapeMenu((REPOElement)(object)menuButton, new Vector2(0f, 0f));
				decorationsPage = new REPOPopupPage("Rotate robot: A/D", (Action<REPOPopupPage>)SetupPopupPage);
				CreatePageContent();
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogInfo((object)"MoreHead UI初始化完成");
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger3 = Logger;
				if (logger3 != null)
				{
					logger3.LogError((object)("初始化UI时出错: " + ex.Message));
				}
			}
		}

		private static void SetupPopupPage(REPOPopupPage page)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				page.SetSize(new Vector2(300f, 350f));
				page.SetBackgroundDimming(true);
				page.SetMaskPadding((Padding?)new Padding(10f, 20f, 20f, 10f));
				AddAuthorCredit(page);
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogInfo((object)"弹出页面设置完成");
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogError((object)("设置弹出页面属性时出错: " + ex.Message));
				}
			}
		}

		private static void AddAuthorCredit(REPOPopupPage page)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				REPOButton val = new REPOButton("<size=10><color=#FFFFA0>Masaicker</color> and <color=#FFFFA0>Yuriscat</color> co-developed.\n由<color=#FFFFA0>马赛克了</color>和<color=#FFFFA0>尤里的猫</color>共同制作。</size>", (Action)delegate
				{
				});
				((REPOSimplePage)page).AddElementToPage((REPOElement)(object)val, new Vector2(300f, 345f));
				try
				{
					MenuManager obj = Object.FindObjectOfType<MenuManager>();
					if (obj != null)
					{
						((MonoBehaviour)obj).StartCoroutine(DelayedStyleAuthorCredit(val));
					}
				}
				catch (Exception ex)
				{
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogWarning((object)("无法修改作者标记样式: " + ex.Message));
					}
				}
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogInfo((object)"添加作者标记完成");
				}
			}
			catch (Exception ex2)
			{
				ManualLogSource? logger3 = Logger;
				if (logger3 != null)
				{
					logger3.LogError((object)("添加作者标记时出错: " + ex2.Message));
				}
			}
		}

		private static IEnumerator DelayedStyleAuthorCredit(REPOButton button)
		{
			yield return null;
			try
			{
				GameObject buttonObj = null;
				Button[] allButtons = Object.FindObjectsOfType<Button>();
				Button[] array = allButtons;
				foreach (Button btn in array)
				{
					if (((Object)btn).name.Contains("Masaicker") && ((Object)btn).name.Contains("Yuriscat"))
					{
						buttonObj = ((Component)btn).gameObject;
						break;
					}
				}
				if (!((Object)(object)buttonObj != (Object)null))
				{
					yield break;
				}
				Button buttonComponent = buttonObj.GetComponent<Button>();
				if (!((Object)(object)buttonComponent != (Object)null))
				{
					yield break;
				}
				((Selectable)buttonComponent).interactable = false;
				Image[] images = buttonObj.GetComponentsInChildren<Image>();
				Image[] array2 = images;
				foreach (Image image in array2)
				{
					if ((Object)(object)((Component)image).gameObject != (Object)(object)((Component)buttonComponent).gameObject)
					{
						((Behaviour)image).enabled = false;
					}
				}
			}
			catch (Exception e)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogWarning((object)("修改作者标记样式失败: " + e.Message));
				}
			}
		}

		private static void OnMenuButtonClick()
		{
			try
			{
				UpdateButtonStates();
				REPOPopupPage? obj = decorationsPage;
				if (obj != null)
				{
					((REPOSimplePage)obj).OpenPage(false);
				}
				SetHeaderPosition();
				MovePlayerAvatarToFront();
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("打开设置页面时出错: " + ex.Message));
				}
			}
		}

		private static void SetHeaderPosition()
		{
			try
			{
				MonoBehaviour obj = Object.FindObjectOfType<MonoBehaviour>();
				if (obj != null)
				{
					obj.StartCoroutine(DelayedSetHeaderPosition());
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("设置标题位置时出错: " + ex.Message));
				}
			}
		}

		private static IEnumerator DelayedSetHeaderPosition()
		{
			yield return null;
			try
			{
				FieldInfo headerTransformField = typeof(REPOPopupPage).GetField("headerTransform", BindingFlags.Instance | BindingFlags.NonPublic);
				if (headerTransformField != null)
				{
					object? value = headerTransformField.GetValue(decorationsPage);
					RectTransform headerTransform = (RectTransform)((value is RectTransform) ? value : null);
					if ((Object)(object)headerTransform != (Object)null)
					{
						((Transform)headerTransform).localPosition = new Vector3(185.5049f, 368.9677f, 0f);
						yield break;
					}
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogWarning((object)"headerTransform为空");
					}
				}
				else
				{
					ManualLogSource? logger2 = Logger;
					if (logger2 != null)
					{
						logger2.LogWarning((object)"找不到headerTransform字段");
					}
				}
			}
			catch (Exception e)
			{
				ManualLogSource? logger3 = Logger;
				if (logger3 != null)
				{
					logger3.LogError((object)("延迟设置标题位置时出错: " + e.Message));
				}
			}
		}

		private static void AdjustBoolSettingPosition()
		{
			try
			{
				MonoBehaviour obj = Object.FindObjectOfType<MonoBehaviour>();
				if (obj != null)
				{
					obj.StartCoroutine(DelayedAdjustBoolSettingPosition());
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("调整Bool Setting位置时出错: " + ex.Message));
				}
			}
		}

		private static IEnumerator DelayedAdjustBoolSettingPosition()
		{
			yield return null;
			try
			{
				object? value = AccessTools.Field(typeof(REPOPopupPage), "menuPage").GetValue(decorationsPage);
				MenuPage menuPage = (MenuPage)((value is MenuPage) ? value : null);
				if (!((Object)(object)menuPage != (Object)null))
				{
					yield break;
				}
				Transform boolSetting = null;
				foreach (Transform item in ((Component)menuPage).transform)
				{
					Transform child = item;
					if ((Object)(object)child != (Object)null && ((Object)child).name.Contains("Bool Setting"))
					{
						boolSetting = child;
						break;
					}
				}
				if ((Object)(object)boolSetting != (Object)null)
				{
					RectTransform rectTransform = ((Component)boolSetting).GetComponent<RectTransform>();
					if ((Object)(object)rectTransform != (Object)null)
					{
						((Transform)rectTransform).localPosition = new Vector3(70f, 202.5f, 0f);
					}
				}
				else
				{
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogWarning((object)"找不到Bool Setting - (Clone)对象");
					}
				}
			}
			catch (Exception e)
			{
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogError((object)("延迟调整Bool Setting位置时出错: " + e.Message));
				}
			}
		}

		private static void CreatePageContent()
		{
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Expected O, but got Unknown
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Expected O, but got Unknown
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				for (int i = 0; i < HeadDecorationManager.Decorations.Count; i++)
				{
					DecorationInfo decoration = HeadDecorationManager.Decorations[i];
					REPOButton val = new REPOButton(GetButtonText(decoration.DisplayName?.ToUpper(), decoration.IsVisible), (Action)delegate
					{
						OnDecorationButtonClick(decoration.Name);
					});
					int num = -(i * 20);
					REPOPopupPage? obj = decorationsPage;
					if (obj != null)
					{
						obj.AddElementToScrollView((REPOElement)(object)val, new Vector2(0f, (float)num));
					}
					decorationButtons[decoration.Name ?? string.Empty] = val;
				}
				REPOButton val2 = new REPOButton("<size=18><color=#FFFFFF>C</color><color=#E6E6E6>L</color><color=#CCCCCC>O</color><color=#B3B3B3>S</color><color=#999999>E</color></size>", (Action)OnCloseButtonClick);
				REPOPopupPage? obj2 = decorationsPage;
				if (obj2 != null)
				{
					((REPOSimplePage)obj2).AddElementToPage((REPOElement)(object)val2, new Vector2(301f, 0f));
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("创建页面内容时出错: " + ex.Message));
				}
			}
		}

		private static void UpdateButtonStates()
		{
			try
			{
				foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
				{
					if (decorationButtons.TryGetValue(decoration.Name ?? string.Empty, out REPOButton value))
					{
						value.SetText(GetButtonText(decoration.DisplayName?.ToUpper(), decoration.IsVisible));
					}
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("更新按钮状态时出错: " + ex.Message));
				}
			}
		}

		private static void OnDecorationButtonClick(string? decorationName)
		{
			string decorationName2 = decorationName;
			try
			{
				DecorationInfo decorationInfo = HeadDecorationManager.Decorations.FirstOrDefault((DecorationInfo d) => d.Name != null && d.Name.Equals(decorationName2, StringComparison.OrdinalIgnoreCase));
				if (decorationInfo == null)
				{
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogWarning((object)("OnDecorationButtonClick: 找不到装饰物: " + decorationName2));
					}
					return;
				}
				bool isEnabled = HeadDecorationManager.ToggleDecorationState(decorationName2);
				if (decorationButtons.TryGetValue(decorationName2, out REPOButton value))
				{
					value.SetText(GetButtonText(decorationInfo.DisplayName?.ToUpper(), isEnabled));
				}
				else
				{
					ManualLogSource? logger2 = Logger;
					if (logger2 != null)
					{
						logger2.LogWarning((object)("OnDecorationButtonClick: 找不到装饰物 " + decorationName2 + " 的按钮"));
					}
				}
				UpdateDecorations();
				ConfigManager.SaveConfig();
			}
			catch (Exception ex)
			{
				ManualLogSource? logger3 = Logger;
				if (logger3 != null)
				{
					logger3.LogError((object)("切换装饰物 " + decorationName2 + " 状态时出错: " + ex.Message));
				}
			}
		}

		private static void OnCloseButtonClick()
		{
			try
			{
				MenuManager.instance.PageCloseAll();
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("关闭页面时出错: " + ex.Message));
				}
			}
		}

		private static void UpdateDecorations()
		{
			try
			{
				PlayerAvatar val = FindLocalPlayer();
				if ((Object)(object)val != (Object)null)
				{
					PlayerUpdatePatch.UpdatePlayerDecorations(val);
					HeadDecorationSync component = ((Component)val).GetComponent<HeadDecorationSync>();
					if ((Object)(object)component != (Object)null)
					{
						component.SyncAllDecorations();
					}
				}
				PlayerUpdatePatch.UpdateMenuPlayerDecorations();
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("更新装饰物状态时出错: " + ex.Message));
				}
			}
		}

		private static PlayerAvatar? FindLocalPlayer()
		{
			try
			{
				PlayerAvatar[] array = Object.FindObjectsOfType<PlayerAvatar>();
				PlayerAvatar[] array2 = array;
				foreach (PlayerAvatar val in array2)
				{
					if ((Object)(object)val?.photonView != (Object)null && val.photonView.IsMine)
					{
						return val;
					}
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("查找本地玩家时出错: " + ex.Message));
				}
			}
			return null;
		}

		private static string GetButtonText(string? name, bool isEnabled)
		{
			return "<size=16>" + (isEnabled ? "<color=#00FF00>[ON]</color>" : "<color=#FF0000>[OFF]</color>") + " " + name + "</size>";
		}

		private static void MovePlayerAvatarToFront()
		{
			try
			{
				MonoBehaviour obj = Object.FindObjectOfType<MonoBehaviour>();
				if (obj != null)
				{
					obj.StartCoroutine(DelayedMovePlayerAvatarToFront());
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("移动玩家模型时出错: " + ex.Message));
				}
			}
		}

		private static IEnumerator DelayedMovePlayerAvatarToFront()
		{
			yield return null;
			try
			{
				PlayerAvatarMenuHover playerAvatarHover = Object.FindObjectOfType<PlayerAvatarMenuHover>();
				if ((Object)(object)playerAvatarHover != (Object)null)
				{
					GameObject playerAvatarObj2 = ((Component)((Component)playerAvatarHover).transform.parent).gameObject;
					object? value = AccessTools.Field(typeof(REPOPopupPage), "menuPage").GetValue(decorationsPage);
					MenuPage menuPage2 = (MenuPage)((value is MenuPage) ? value : null);
					if ((Object)(object)menuPage2 != (Object)null)
					{
						playerAvatarObj2.transform.SetParent(((Component)menuPage2).transform, true);
						playerAvatarObj2.transform.SetAsLastSibling();
						playerAvatarObj2.transform.localPosition = new Vector3(-76f, -30f, 0f);
					}
					yield break;
				}
				GameObject playerAvatarObj = GameObject.Find("Menu Element Player Avatar");
				if ((Object)(object)playerAvatarObj != (Object)null)
				{
					object? value2 = AccessTools.Field(typeof(REPOPopupPage), "menuPage").GetValue(decorationsPage);
					MenuPage menuPage = (MenuPage)((value2 is MenuPage) ? value2 : null);
					if ((Object)(object)menuPage != (Object)null)
					{
						playerAvatarObj.transform.SetParent(((Component)menuPage).transform, true);
						playerAvatarObj.transform.SetAsLastSibling();
						playerAvatarObj.transform.localPosition = new Vector3(-76f, -30f, 0f);
						ManualLogSource? logger = Logger;
						if (logger != null)
						{
							logger.LogInfo((object)"已通过名称查找将玩家模型移动到前面,并设置坐标为(-76, -30, 0)");
						}
					}
				}
				else
				{
					ManualLogSource? logger2 = Logger;
					if (logger2 != null)
					{
						logger2.LogWarning((object)"找不到玩家模型对象");
					}
				}
			}
			catch (Exception e)
			{
				ManualLogSource? logger3 = Logger;
				if (logger3 != null)
				{
					logger3.LogError((object)("延迟移动玩家模型时出错: " + e.Message));
				}
			}
		}
	}
}

plugins/MoreHeadUtilities.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using JetBrains.Annotations;
using MenuLib;
using MenuLib.MonoBehaviors;
using Microsoft.CodeAnalysis;
using MoreHead;
using MoreHead.MoreHead.Patchers;
using MoreHeadUtilities.Plugin;
using TMPro;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("MoreHeadUtilities")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+3911decbf9634d63ae1bca5173060ee0fee13c40")]
[assembly: AssemblyProduct("MoreHeadUtilities")]
[assembly: AssemblyTitle("MoreHeadUtilities")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

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

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

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

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace MoreHeadUtilities
{
	public class PartShrinker : MonoBehaviour
	{
		[SerializeField]
		private HiddenParts.Part partToHide = HiddenParts.Part.LeftPupil;

		[SerializeField]
		private bool hideChildren = true;

		private Transform TotalParent;

		private HiddenParts parentComponent;

		private static double totalSearchingTime;

		private bool isFrameOne = true;

		private bool isFrameTwo;

		public static ManualLogSource bepInExLog;

		public static void Init(ManualLogSource source)
		{
			bepInExLog = source;
			bepInExLog.LogInfo((object)"LoggerUtil initialized!");
		}

		public void Log(string message)
		{
			if (MoreHeadUtilitiesPlugin._enableDebugLogging.Value)
			{
				bepInExLog.LogInfo((object)message);
			}
		}

		public void LogError(string message)
		{
			if (MoreHeadUtilitiesPlugin._enableDebugLogging.Value)
			{
				bepInExLog.LogError((object)message);
			}
		}

		public void Update()
		{
			if (isFrameOne)
			{
				isFrameOne = false;
				isFrameTwo = true;
			}
			else
			{
				if (!isFrameTwo)
				{
					return;
				}
				isFrameTwo = false;
				Stopwatch.StartNew();
				if (!Object.op_Implicit((Object)(object)parentComponent))
				{
					Log(((Object)((Component)this).gameObject).name + " is finding parent on awakening");
					TotalParent = ((Component)this).transform;
					while (((Object)TotalParent).name != "ANIM BOT" && ((Object)TotalParent).name != null && ((Object)TotalParent).name != "WorldDecorationFollower")
					{
						TotalParent = TotalParent.parent;
					}
					if (((Object)TotalParent).name == null)
					{
						LogError("No root found");
						return;
					}
					if (((Object)TotalParent).name == "WorldDecorationFollower")
					{
						LogError(((Object)((Component)this).gameObject).name + " is set to world parent. MoreHeadUtilities does not support part removal from a world object.");
						return;
					}
					parentComponent = ((Component)TotalParent).GetComponent<HiddenParts>();
					if (!Object.op_Implicit((Object)(object)parentComponent))
					{
						parentComponent = ((Component)TotalParent).gameObject.AddComponent<HiddenParts>();
					}
					else
					{
						Log("Part already exists");
					}
				}
				parentComponent.AddHiddenPart(partToHide, hideChildren);
			}
		}

		private void OnDisable()
		{
			if (isFrameOne)
			{
				return;
			}
			isFrameOne = true;
			if (!Object.op_Implicit((Object)(object)parentComponent))
			{
				Log(((Object)((Component)this).gameObject).name + " is finding parent for destruction");
				TotalParent = ((Component)this).transform;
				while (((Object)TotalParent).name != "ANIM BOT" && ((Object)TotalParent).name != null && ((Object)TotalParent).name != "WorldDecorationFollower")
				{
					TotalParent = TotalParent.parent;
				}
				if (((Object)TotalParent).name == null)
				{
					LogError("No root found");
					return;
				}
				if (((Object)TotalParent).name == "WorldDecorationFollower")
				{
					LogError(((Object)((Component)this).gameObject).name + " is set to world parent. MoreHeadUtilities does not support part removal from a world object.");
					return;
				}
				parentComponent = ((Component)TotalParent).GetComponent<HiddenParts>();
				if (!Object.op_Implicit((Object)(object)parentComponent))
				{
					parentComponent = ((Component)TotalParent).gameObject.AddComponent<HiddenParts>();
				}
				else
				{
					Log("Component already exists");
				}
			}
			parentComponent.RemoveHiddenPart(partToHide, hideChildren);
		}
	}
	public class HiddenParts : MonoBehaviour
	{
		public enum Part
		{
			Health,
			LeftArm,
			RightArm,
			LeftLeg,
			RightLeg,
			EyeLeft,
			EyeRight,
			Head,
			Neck,
			Body,
			Hips,
			LeftPupil,
			RightPupil
		}

		public static ManualLogSource bepInExLog;

		private string[][] partNames = new string[13][]
		{
			new string[3] { "mesh_health", "mesh_health frame", "mesh_health shadow" },
			new string[1] { "mesh_arm_l" },
			new string[1] { "mesh_arm_r" },
			new string[1] { "mesh_leg_l" },
			new string[1] { "mesh_leg_r" },
			new string[1] { "mesh_eye_l" },
			new string[1] { "mesh_eye_r" },
			new string[1] { "mesh_head_top" },
			new string[2] { "mesh_head_bot_sphere", "mesh_head_bot_flat" },
			new string[2] { "mesh_body_top_sphere", "mesh_body_top_flat" },
			new string[1] { "mesh_body_bot" },
			new string[1] { "mesh_pupil_l" },
			new string[1] { "mesh_pupil_r" }
		};

		private MeshRenderer[][] partRenderers = new MeshRenderer[13][]
		{
			(MeshRenderer[])(object)new MeshRenderer[3],
			(MeshRenderer[])(object)new MeshRenderer[1],
			(MeshRenderer[])(object)new MeshRenderer[1],
			(MeshRenderer[])(object)new MeshRenderer[1],
			(MeshRenderer[])(object)new MeshRenderer[1],
			(MeshRenderer[])(object)new MeshRenderer[1],
			(MeshRenderer[])(object)new MeshRenderer[1],
			(MeshRenderer[])(object)new MeshRenderer[1],
			(MeshRenderer[])(object)new MeshRenderer[2],
			(MeshRenderer[])(object)new MeshRenderer[2],
			(MeshRenderer[])(object)new MeshRenderer[1],
			(MeshRenderer[])(object)new MeshRenderer[1],
			(MeshRenderer[])(object)new MeshRenderer[1]
		};

		private Part[][] childParts = new Part[13][]
		{
			new Part[0],
			new Part[0],
			new Part[0],
			new Part[0],
			new Part[0],
			new Part[1] { Part.LeftPupil },
			new Part[1] { Part.RightPupil },
			new Part[2]
			{
				Part.EyeLeft,
				Part.EyeRight
			},
			new Part[2]
			{
				Part.Head,
				Part.Health
			},
			new Part[3]
			{
				Part.Neck,
				Part.LeftArm,
				Part.RightArm
			},
			new Part[3]
			{
				Part.Body,
				Part.LeftLeg,
				Part.RightLeg
			},
			new Part[0],
			new Part[0]
		};

		private List<Part> hiddenParts = new List<Part>();

		private bool updatedThisFrame;

		public static void Init(ManualLogSource source)
		{
			bepInExLog = source;
			bepInExLog.LogInfo((object)"LoggerUtil initialized!");
		}

		public void Log(string message)
		{
			ManualLogSource obj = bepInExLog;
			if (obj != null)
			{
				obj.LogInfo((object)message);
			}
		}

		public void LogError(string message)
		{
			ManualLogSource obj = bepInExLog;
			if (obj != null)
			{
				obj.LogError((object)message);
			}
		}

		public void Start()
		{
			foreach (Part value in Enum.GetValues(typeof(Part)))
			{
				for (int i = 0; i < partNames[(int)value].Length; i++)
				{
					Transform val = FindInHierarchy(((Component)this).transform, partNames[(int)value][i]);
					if ((Object)(object)val == (Object)null)
					{
						Log("Part '" + partNames[(int)value][i] + "' not found");
						continue;
					}
					MeshRenderer component = ((Component)val).gameObject.GetComponent<MeshRenderer>();
					if (Object.op_Implicit((Object)(object)component))
					{
						Log("Found part '" + partNames[(int)value][i] + "'");
						partRenderers[(int)value][i] = component;
					}
				}
			}
		}

		public void AddHiddenPart(Part part, bool hideChildren, bool update = true)
		{
			Log($"Adding part {part}");
			hiddenParts.Add(part);
			if (hideChildren)
			{
				Part[] array = childParts[(int)part];
				foreach (Part part2 in array)
				{
					AddHiddenPart(part2, hideChildren, update: false);
				}
			}
			updatedThisFrame = true;
		}

		public void RemoveHiddenPart(Part part, bool hideChildren, bool update = true)
		{
			if (hiddenParts.Contains(part))
			{
				hiddenParts.Remove(part);
			}
			if (hideChildren)
			{
				Part[] array = childParts[(int)part];
				foreach (Part part2 in array)
				{
					RemoveHiddenPart(part2, hideChildren, update: false);
				}
			}
			updatedThisFrame = true;
		}

		private Transform FindInHierarchy(Transform parent, string name)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Expected O, but got Unknown
			if (((Object)parent).name == name)
			{
				return parent;
			}
			foreach (Transform item in parent)
			{
				Transform parent2 = item;
				Transform val = FindInHierarchy(parent2, name);
				if ((Object)(object)val != (Object)null)
				{
					return val;
				}
			}
			return null;
		}

		public void LateUpdate()
		{
			if (updatedThisFrame)
			{
				UpdateHiddenParts();
				updatedThisFrame = false;
			}
		}

		public void UpdateHiddenParts()
		{
			Log($"Updating parts, to be hidden: {hiddenParts.ToArray()}");
			foreach (Part value in Enum.GetValues(typeof(Part)))
			{
				ShowPart(value);
			}
			foreach (Part hiddenPart in hiddenParts)
			{
				HidePart(hiddenPart);
			}
		}

		private void ShowPart(Part partToShow)
		{
			for (int i = 0; i < partNames[(int)partToShow].Length; i++)
			{
				MeshRenderer component = ((Component)partRenderers[(int)partToShow][i]).gameObject.GetComponent<MeshRenderer>();
				if (Object.op_Implicit((Object)(object)component))
				{
					((Renderer)component).enabled = true;
				}
			}
		}

		private void HidePart(Part partToHide)
		{
			for (int i = 0; i < partNames[(int)partToHide].Length; i++)
			{
				MeshRenderer component = ((Component)partRenderers[(int)partToHide][i]).gameObject.GetComponent<MeshRenderer>();
				if (Object.op_Implicit((Object)(object)component))
				{
					((Renderer)component).enabled = false;
				}
			}
		}
	}
}
namespace MoreHeadUtilities.Plugin
{
	[BepInPlugin("com.maygik.moreheadutilities", "MoreHeadUtilities", "1.0.0")]
	public class MoreHeadUtilitiesPlugin : BaseUnityPlugin
	{
		public static ConfigEntry<bool> _enableDebugLogging;

		private void Awake()
		{
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			_enableDebugLogging = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "EnableDebugLogging", false, "Enable debug logging for MoreHeadUtilities.");
			if (_enableDebugLogging.Value)
			{
				PartShrinker.Init(((BaseUnityPlugin)this).Logger);
				ManualLogSource logger = ((BaseUnityPlugin)this).Logger;
				if (logger != null)
				{
					logger.LogInfo((object)"MoreHeadUtilities initialized and logger passed to PartShrinker.");
				}
				HiddenParts.Init(((BaseUnityPlugin)this).Logger);
				ManualLogSource logger2 = ((BaseUnityPlugin)this).Logger;
				if (logger2 != null)
				{
					logger2.LogInfo((object)"MoreHeadUtilities initialized and logger passed to HiddenParts.");
				}
				Logger.Init(((BaseUnityPlugin)this).Logger);
				ManualLogSource logger3 = ((BaseUnityPlugin)this).Logger;
				if (logger3 != null)
				{
					logger3.LogInfo((object)"MoreHeadUtilities initialized and logger passed to DecorationGroups.");
				}
			}
			new Harmony("com.maygik.moreheadutilities").PatchAll();
			ManualLogSource logger4 = ((BaseUnityPlugin)this).Logger;
			if (logger4 != null)
			{
				logger4.LogInfo((object)"Harmony patches applied.");
			}
		}
	}
}
namespace MoreHead
{
	internal static class Logger
	{
		public static ManualLogSource? log;

		public static void Init(ManualLogSource logger)
		{
			log = logger;
		}

		public static void Log(string message)
		{
			ManualLogSource? obj = log;
			if (obj != null)
			{
				obj.LogInfo((object)message);
			}
		}

		public static void LogError(string message)
		{
			ManualLogSource? obj = log;
			if (obj != null)
			{
				obj.LogError((object)message);
			}
		}
	}
	internal static class MoreHeadGroupStorage
	{
		public static Dictionary<string?, List<string?>> tagGroupElements = new Dictionary<string, List<string>>();

		public static Dictionary<string, bool> activeGroups = new Dictionary<string, bool>();
	}
	internal static class MoreHeadUIStorage
	{
		[CanBeNull]
		public static REPOPopupPage page = null;

		[CanBeNull]
		public static string group = null;

		public static bool resetPosition = true;

		public static Dictionary<string?, REPOButton> groupButtons = new Dictionary<string, REPOButton>();

		public static Dictionary<string?, List<string>> groupButtonTags = new Dictionary<string, List<string>>();
	}
	internal class HeadDecorationManagerStorage
	{
		public static List<string?> Decorations = new List<string>();
	}
	[HarmonyPatch(typeof(MoreHeadUI))]
	[HarmonyPatch("CreateAllDecorationButtons", new Type[] { typeof(REPOPopupPage) })]
	internal static class Patch_CreateAllDecorationButtons
	{
		private static readonly MethodInfo ClearScrolls = AccessTools.Method(typeof(Dictionary<string, List<REPOScrollViewElement>>), "Clear", (Type[])null, (Type[])null);

		private static readonly MethodInfo ToListDecorations = AccessTools.Method(typeof(Enumerable), "ToList", (Type[])null, (Type[])null).MakeGenericMethod(typeof(DecorationInfo));

		private static readonly MethodInfo Helper1 = AccessTools.Method(typeof(MoreHeadUIHelpers), "Patch1_CreateAllDecorationButtons", (Type[])null, (Type[])null);

		private static readonly MethodInfo Helper2 = AccessTools.Method(typeof(MoreHeadUIHelpers), "Patch2_CreateAllDecorationButtons", new Type[1] { typeof(REPOPopupPage) }, (Type[])null);

		private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instrs, ILGenerator il)
		{
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Expected O, but got Unknown
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Expected O, but got Unknown
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0124: Expected O, but got Unknown
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: Expected O, but got Unknown
			List<CodeInstruction> list = instrs.ToList();
			bool flag = false;
			bool flag2 = false;
			for (int i = 0; i < list.Count; i++)
			{
				CodeInstruction val = list[i];
				if (!flag && val.opcode == OpCodes.Callvirt && val.operand == ClearScrolls)
				{
					Logger.Log("Patching Patch1_CreateAllDecorationButtons");
					list.Insert(++i, new CodeInstruction(OpCodes.Call, (object)Helper1));
					flag = true;
				}
				else if (!flag2 && val.opcode == OpCodes.Call && val.operand == ToListDecorations)
				{
					Logger.Log("Patching Patch2_CreateAllDecorationButtons");
					int num = list.FindLastIndex((CodeInstruction ci) => ci.opcode == OpCodes.Ret);
					if (num < 0)
					{
						throw new InvalidOperationException("Couldn't find the final ret in CreateAllDecorationButtons");
					}
					CodeInstruction obj = list[num];
					Label label = il.DefineLabel();
					obj.labels.Add(label);
					list.Insert(++i, new CodeInstruction(OpCodes.Ldarg_0, (object)null));
					list.Insert(++i, new CodeInstruction(OpCodes.Call, (object)Helper2));
					list.Insert(++i, new CodeInstruction(OpCodes.Leave_S, (object)label));
					Logger.Log("Patched Patch2_CreateAllDecorationButtons");
					break;
				}
			}
			return list;
		}
	}
	[HarmonyPatch(typeof(MoreHeadUI))]
	[HarmonyPatch("CreateAllDecorationButtons", new Type[] { typeof(REPOPopupPage) })]
	internal static class Prefix_CreateAllDecorationButtons
	{
		[HarmonyPrefix]
		private static bool Prefix(REPOPopupPage page)
		{
			MoreHeadUIStorage.page = page;
			MoreHeadUIStorage.groupButtons.Clear();
			MoreHeadUIStorage.groupButtonTags.Clear();
			return true;
		}
	}
	[HarmonyPatch(typeof(MoreHeadUI))]
	[HarmonyPatch("CreateDecorationButton", new Type[]
	{
		typeof(REPOPopupPage),
		typeof(DecorationInfo)
	})]
	internal static class Patch_CreateDecorationButton
	{
		private static readonly MethodInfo ShowTagDecorationsMI = AccessTools.Method(typeof(MoreHeadUI), "ShowTagDecorations", new Type[1] { typeof(string) }, (Type[])null);

		[HarmonyPrefix]
		private static bool Prefix(REPOPopupPage page, DecorationInfo decoration)
		{
			try
			{
				string text = HeadDecorationManagerStorage.Decorations[HeadDecorationManager.Decorations.IndexOf(decoration)];
				if (text != null && text != "" && MoreHeadGroupStorage.tagGroupElements.TryGetValue("ALL", out List<string> value))
				{
					if (!MoreHeadGroupStorage.activeGroups.ContainsKey(text))
					{
						Logger.Log("Initialising group: " + text);
						MoreHeadGroupStorage.activeGroups[text] = false;
					}
					if (!value.Contains(text))
					{
						CreateGroupButton(page, text);
					}
				}
				string[] source = (string[])typeof(MoreHeadUI).GetField("LIMB_TAGS", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).GetValue(null);
				MoreHeadGroupStorage.tagGroupElements["ALL"].Add(text);
				if (text != null)
				{
					if (!MoreHeadUIStorage.groupButtonTags.ContainsKey(text))
					{
						Logger.Log("Initialising group button tag list for " + text);
						MoreHeadUIStorage.groupButtonTags[text] = new List<string>();
					}
					MoreHeadUIStorage.groupButtonTags[text].Add("ALL");
				}
				List<string> value2;
				if (source.Contains(decoration.ParentTag.ToUpper()))
				{
					MoreHeadGroupStorage.tagGroupElements["LIMBS"].Add(text);
					if (text != null)
					{
						MoreHeadUIStorage.groupButtonTags[text].Add("LIMBS");
					}
				}
				else if (MoreHeadGroupStorage.tagGroupElements.TryGetValue(decoration.ParentTag.ToUpper(), out value2))
				{
					value2.Add(text);
					if (text != null)
					{
						MoreHeadUIStorage.groupButtonTags[text].Add(decoration.ParentTag.ToUpper());
					}
				}
				return true;
			}
			catch (Exception arg)
			{
				Logger.LogError($"Error creating decoration button {decoration.Name}: {arg}");
				throw;
			}
		}

		private static string GetGroupButtonText(string group)
		{
			if (!MoreHeadGroupStorage.activeGroups[group])
			{
				return "<size=20><color=#CCCCCC>[+]" + group + "</color></size>";
			}
			return "<size=20><color=#777777>[-]" + group + "</color></size>";
		}

		private static void CreateGroupButton(REPOPopupPage page, string groupName)
		{
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Expected O, but got Unknown
			Logger.Log("Creating group button: " + groupName);
			try
			{
				string buttonText = GetGroupButtonText(groupName);
				REPOButton repoButton = null;
				page.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView)
				{
					//IL_0038: Unknown result type (might be due to invalid IL or missing references)
					//IL_003e: Unknown result type (might be due to invalid IL or missing references)
					repoButton = MenuAPI.CreateREPOButton(buttonText, (Action)delegate
					{
						OnDecorationGroupButtonClick(groupName);
					}, scrollView, default(Vector2));
					return ((REPOElement)repoButton).rectTransform;
				}, 0f, 0f);
				if ((Object)(object)repoButton != (Object)null)
				{
					MoreHeadUIStorage.groupButtons[groupName] = repoButton;
					MoreHeadUIStorage.groupButtonTags[groupName] = new List<string>();
					MoreHeadUIStorage.group = groupName;
					Logger.Log("Created group button: " + groupName);
					return;
				}
				throw new Exception("Failed to create group button.");
			}
			catch (Exception ex)
			{
				Logger.Log("Error creating group button: " + ex.Message);
			}
		}

		private static void OnDecorationGroupButtonClick(string? groupName)
		{
			Logger.Log("OnDecorationGroupButtonClick called for group: " + groupName);
			MoreHeadGroupStorage.activeGroups[groupName] = !MoreHeadGroupStorage.activeGroups[groupName];
			Logger.Log("Invoking show tag decorations");
			string text = (string)typeof(MoreHeadUI).GetField("currentTagFilter", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null);
			MoreHeadUIStorage.resetPosition = false;
			ShowTagDecorationsMI.Invoke(null, new object[1] { text });
			if (MoreHeadUIStorage.groupButtons.TryGetValue(groupName, out var value))
			{
				string groupButtonText = GetGroupButtonText(groupName);
				((TMP_Text)value.labelTMP).text = groupButtonText;
			}
			MoreHeadUIStorage.resetPosition = true;
		}
	}
	[HarmonyPatch(typeof(HeadDecorationManager))]
	[HarmonyPatch("LoadDecorationBundle", new Type[] { typeof(string) })]
	internal static class Patch_LoadDecorationBundle
	{
		private static readonly MethodInfo EnsureUniqueDisplayName = AccessTools.Method(typeof(HeadDecorationManager), "EnsureUniqueDisplayName", new Type[1] { typeof(string) }, (Type[])null);

		private static readonly MethodInfo EnsureUniqueName = AccessTools.Method(typeof(HeadDecorationManager), "EnsureUniqueName", new Type[1] { typeof(string) }, (Type[])null);

		private static readonly MethodInfo AddDecorationHelper1 = AccessTools.Method(typeof(HeadDecorationManagerHelpers), "Patch1_LoadDecorationBundle", new Type[1] { typeof(string) }, (Type[])null);

		private static readonly MethodInfo AddDecorationHelper2 = AccessTools.Method(typeof(HeadDecorationManagerHelpers), "Patch2_LoadDecorationBundle", (Type[])null, (Type[])null);

		private static readonly MethodInfo AddDecorationHelper3 = AccessTools.Method(typeof(HeadDecorationManagerHelpers), "Patch3_LoadDecorationBundle", (Type[])null, (Type[])null);

		private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instrs)
		{
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Expected O, but got Unknown
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Expected O, but got Unknown
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Expected O, but got Unknown
			//IL_0154: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Expected O, but got Unknown
			List<CodeInstruction> list = instrs.ToList();
			bool flag = false;
			bool flag2 = false;
			bool flag3 = false;
			for (int i = 0; i < list.Count(); i++)
			{
				CodeInstruction val = list[i];
				if (val.opcode == OpCodes.Call && val.operand == EnsureUniqueDisplayName)
				{
					Logger.Log("Patching AddDecorationHelper2");
					list.Insert(i, new CodeInstruction(OpCodes.Call, (object)AddDecorationHelper2));
					Logger.Log("Patched AddDecorationHelper2");
					flag2 = true;
					i += 2;
				}
				if (val.opcode == OpCodes.Call && val.operand == EnsureUniqueName)
				{
					Logger.Log("Patching AddDecorationHelper1");
					list.Insert(i, new CodeInstruction(OpCodes.Dup, (object)null));
					list.Insert(i + 1, new CodeInstruction(OpCodes.Call, (object)AddDecorationHelper1));
					Logger.Log("Patched AddDecorationHelper1");
					flag = true;
					i += 2;
				}
				if (!flag3 && list[i].opcode == OpCodes.Call && list[i].operand == AccessTools.Method(typeof(DecorationBlacklistManager), "IsBlacklisted", new Type[1] { typeof(string) }, (Type[])null))
				{
					int num = i + 4;
					Logger.Log("Patching AddDecorationHelper3");
					list.Insert(num++, new CodeInstruction(OpCodes.Call, (object)AddDecorationHelper3));
					Logger.Log("Patched AddDecorationHelper3");
					flag3 = true;
					i += 5;
				}
				if (flag2 && flag && flag3)
				{
					break;
				}
			}
			return list;
		}
	}
	[HarmonyPatch(typeof(MoreHeadUI))]
	[HarmonyPatch("CreateDecorationButton", new Type[]
	{
		typeof(REPOPopupPage),
		typeof(DecorationInfo)
	})]
	internal static class Transpiler_CreateDecorationButton
	{
		private static readonly MethodInfo PatchMethod = AccessTools.Method(typeof(MoreHeadUIHelpers), "Patch1_CreateDecorationButton", new Type[2]
		{
			typeof(DecorationInfo),
			typeof(string)
		}, (Type[])null);

		private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instrs)
		{
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Expected O, but got Unknown
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Expected O, but got Unknown
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Expected O, but got Unknown
			List<CodeInstruction> list = instrs.ToList();
			for (int i = 0; i < list.Count; i++)
			{
				CodeInstruction val = list[i];
				if (val.opcode == OpCodes.Callvirt && val.operand is MethodInfo methodInfo && methodInfo.Name == "Add" && methodInfo.DeclaringType == typeof(List<REPOScrollViewElement>))
				{
					Logger.Log("Patch adding group");
					list.Insert(i + 1, new CodeInstruction(OpCodes.Ldarg_1, (object)null));
					list.Insert(i + 2, new CodeInstruction(OpCodes.Ldstr, (object)(MoreHeadUIStorage.group ?? "")));
					list.Insert(i + 3, new CodeInstruction(OpCodes.Call, (object)PatchMethod));
					i += 3;
				}
			}
			return list;
		}
	}
	[HarmonyPatch(typeof(MoreHeadUI))]
	[HarmonyPatch("ShowTagDecorations", new Type[] { typeof(string) })]
	internal static class Patch_ShowTagDecorations
	{
		[HarmonyPrefix]
		private static bool Prefix(string tag)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			try
			{
				Type typeFromHandle = typeof(MoreHeadUI);
				Logger.Log("Accessing decorationsPage");
				REPOPopupPage val = (REPOPopupPage)typeFromHandle.GetField("decorationsPage", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).GetValue(null);
				Logger.Log("Accessing tagScrollViewElements");
				Dictionary<string, List<REPOScrollViewElement>> dictionary = (Dictionary<string, List<REPOScrollViewElement>>)typeFromHandle.GetField("tagScrollViewElements", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).GetValue(null);
				Logger.Log("Accessing currentTagFilter");
				FieldInfo field = typeFromHandle.GetField("currentTagFilter", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
				string text = (string)field.GetValue(null);
				Logger.Log("Running the proper ShowTagDecorations function");
				dictionary.TryGetValue(text, out var value);
				MoreHeadGroupStorage.tagGroupElements.TryGetValue(text, out List<string> value2);
				Logger.Log($"There are {value.Count()} scroll elements and {value2.Count()} grouped elements");
				if (!string.IsNullOrEmpty(text))
				{
					for (int i = 0; i < value.Count(); i++)
					{
						if ((Object)(object)value[i] != (Object)null)
						{
							value[i].visibility = false;
						}
					}
					for (int j = 0; j < value2.Count(); j++)
					{
						if (value2[j] != null)
						{
							((REPOElement)MoreHeadUIStorage.groupButtons[value2[j]]).repoScrollViewElement.visibility = false;
						}
					}
				}
				Logger.Log("Element visibility hidden");
				dictionary.TryGetValue(tag, out value);
				MoreHeadGroupStorage.tagGroupElements.TryGetValue(tag, out value2);
				Logger.Log($"There are {value.Count()} tagged scroll elements and {value2.Count()} tagged grouped elements");
				if (!string.IsNullOrEmpty(tag))
				{
					for (int k = 0; k < value.Count(); k++)
					{
						if (value2[k] == null)
						{
							if ((Object)(object)value[k] != (Object)null)
							{
								value[k].visibility = true;
							}
						}
						else if ((Object)(object)value[k] != (Object)null && MoreHeadGroupStorage.activeGroups[value2[k]])
						{
							value[k].visibility = true;
						}
					}
					for (int l = 0; l < value2.Count(); l++)
					{
						if (value2[l] != null && MoreHeadUIStorage.groupButtonTags[value2[l]].Contains(tag))
						{
							((REPOElement)MoreHeadUIStorage.groupButtons[value2[l]]).repoScrollViewElement.visibility = true;
						}
					}
				}
				field.SetValue(null, tag);
				if (MoreHeadUIStorage.resetPosition)
				{
					val.scrollView.SetScrollPosition(0f);
				}
				val.scrollView.UpdateElements();
			}
			catch (Exception ex)
			{
				Logger.LogError("Error showing decorations for tag: " + tag + " | Error: " + ex.Message);
			}
			return false;
		}
	}
}
namespace MoreHead.MoreHead.Patchers
{
	public static class HeadDecorationManagerHelpers
	{
		public static string bundleName;

		public static void Patch1_LoadDecorationBundle(string bundleBaseName)
		{
			Logger.Log("Saving bundle name");
			bundleName = bundleBaseName;
		}

		public static void Patch2_LoadDecorationBundle()
		{
			Logger.Log("Patch_LoadDecorationBundle called");
			string text = null;
			if (bundleName.Contains("~"))
			{
				string[] array = bundleName.Split(new char[1] { '~' });
				if (array.Length >= 2)
				{
					text = array[^1].ToLower();
					Logger.Log("Setting group: " + text);
				}
			}
			Logger.Log("Adding decoration");
			HeadDecorationManagerStorage.Decorations.Add(text);
		}

		public static void Patch3_LoadDecorationBundle()
		{
			HeadDecorationManagerStorage.Decorations.RemoveAt(HeadDecorationManagerStorage.Decorations.Count - 1);
			Logger.Log("Removing last from decoration group list");
		}
	}
	public static class MoreHeadUIHelpers
	{
		private static bool _inHelper;

		public static void Patch1_CreateAllDecorationButtons()
		{
			Logger.Log("Starting patch of CreateAllDecorationButtons");
			Logger.Log("Accessing type MoreHeadUI");
			Type typeFromHandle = typeof(MoreHeadUI);
			Logger.Log("Setting binding flags to Static and NonPublic");
			Logger.Log("Retrieving ALL_TAGS field from MoreHeadUI");
			string[] array = (string[])typeFromHandle.GetField("ALL_TAGS", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null);
			foreach (string key in array)
			{
				MoreHeadGroupStorage.tagGroupElements[key] = new List<string>();
			}
		}

		public static void Patch2_CreateAllDecorationButtons(REPOPopupPage page)
		{
			try
			{
				Logger.Log("Starting Patch2_CreateAllDecorationButtons");
				_ = (string[])typeof(MoreHeadUI).GetField("ALL_TAGS", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null);
				List<DecorationInfo> allDecorations = HeadDecorationManager.Decorations.ToList();
				Logger.Log("Gotten IsBuiltInDecoration");
				MethodInfo isBuiltInMI = AccessTools.Method(typeof(MoreHeadUI), "IsBuiltInDecoration", new Type[1] { typeof(DecorationInfo) }, (Type[])null);
				if (isBuiltInMI.GetParameters().Length == 1 && isBuiltInMI.ReturnType == typeof(bool))
				{
					_ = (Func<DecorationInfo, bool>)Delegate.CreateDelegate(typeof(Func<DecorationInfo, bool>), isBuiltInMI);
					Logger.Log("Delegate successfully created for IsBuiltInDecoration.");
					Logger.Log("Bound Delegate");
					List<DecorationInfo> list = (from decoration in allDecorations
						where (bool)isBuiltInMI.Invoke(null, new object[1] { decoration })
						orderby HeadDecorationManagerStorage.Decorations[allDecorations.IndexOf(decoration)], decoration.DisplayName
						select decoration).ToList();
					Logger.Log("builtInDecorations sorted");
					List<DecorationInfo> list2 = (from decoration in allDecorations
						where !(bool)isBuiltInMI.Invoke(null, new object[1] { decoration })
						orderby HeadDecorationManagerStorage.Decorations[allDecorations.IndexOf(decoration)] ?? '\uffff'.ToString(), decoration.DisplayName
						select decoration).ToList();
					Logger.Log("externalDecorations sorted");
					MethodInfo methodInfo = AccessTools.Method(typeof(MoreHeadUI), "CreateDecorationButton", new Type[2]
					{
						typeof(REPOPopupPage),
						typeof(DecorationInfo)
					}, (Type[])null);
					foreach (DecorationInfo item in list)
					{
						methodInfo.Invoke(null, new object[2] { page, item });
					}
					foreach (DecorationInfo item2 in list2)
					{
						methodInfo.Invoke(null, new object[2] { page, item2 });
					}
					Logger.Log("externalDecorations all created");
					MoreHeadUIStorage.group = null;
					return;
				}
				throw new InvalidOperationException("IsBuiltInDecoration method signature does not match Func<DecorationInfo, bool>.");
			}
			catch (Exception arg)
			{
				Logger.LogError($"Error creating all decoration buttons: {arg}");
				throw;
			}
		}

		public static void Patch1_CreateDecorationButton(DecorationInfo decoration, string group)
		{
			if (_inHelper)
			{
				return;
			}
			_inHelper = true;
			try
			{
			}
			finally
			{
				_inHelper = false;
			}
		}
	}
}

plugins/MorePlayers.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using ExitGames.Client.Photon;
using HarmonyLib;
using Photon.Pun;
using Photon.Realtime;
using Steamworks;
using Steamworks.Data;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("0.0.0.0")]
namespace MorePlayers;

[BepInPlugin("spindles.MorePlayersImproved", "MorePlayersImproved", "1.0.2")]
public class Plugin : BaseUnityPlugin
{
	[HarmonyPatch(typeof(NetworkConnect), "TryJoiningRoom")]
	public class TryJoiningRoomPatch
	{
		private static bool Prefix(ref string ___RoomName)
		{
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Expected O, but got Unknown
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Expected O, but got Unknown
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Expected O, but got Unknown
			string value = Traverse.Create((object)DataDirector.instance).Field("networkPassword").GetValue() as string;
			if (string.IsNullOrEmpty(___RoomName))
			{
				mls.LogError((object)"RoomName is null or empty, using previous method!");
				return true;
			}
			if (configMaxPlayers.Value == 0)
			{
				mls.LogError((object)"The MaxPlayers config is null or empty, using previous method!");
				return true;
			}
			Debug.Log((object)("Trying to join room: " + ___RoomName));
			Hashtable val = new Hashtable();
			((Dictionary<object, object>)(object)val).Add((object)"PASSWORD", (object)value);
			PhotonNetwork.LocalPlayer.SetCustomProperties(val, (Hashtable)null, (WebFlags)null);
			RoomOptions val2 = new RoomOptions
			{
				MaxPlayers = configMaxPlayers.Value,
				IsVisible = false
			};
			Hashtable val3 = new Hashtable();
			((Dictionary<object, object>)(object)val3).Add((object)"PASSWORD", (object)value);
			val2.CustomRoomProperties = val3;
			PhotonNetwork.JoinOrCreateRoom(___RoomName, val2, TypedLobby.Default, (string[])null);
			return false;
		}
	}

	[HarmonyPatch(typeof(NetworkConnect), "OnConnectedToMaster")]
	public class OnConnectedToMasterPatch
	{
		private static bool Prefix()
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Expected O, but got Unknown
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_013d: Expected O, but got Unknown
			//IL_0142: Expected O, but got Unknown
			if (!configPublicLobbySupport.Value)
			{
				return true;
			}
			_ = (Lobby)Traverse.Create((object)SteamManager.instance).Field("currentLobby").GetValue();
			bool flag = (bool)Traverse.Create((object)GameManager.instance).Field("connectRandom").GetValue();
			_ = (string)Traverse.Create((object)DataDirector.instance).Field("networkPassword").GetValue();
			string text = (string)Traverse.Create((object)DataDirector.instance).Field("networkServerName").GetValue();
			_ = (string)Traverse.Create((object)DataDirector.instance).Field("networkJoinServerName").GetValue();
			if (string.IsNullOrEmpty(text))
			{
				mls.LogError((object)"RoomName is null or empty, using previous method!");
				return true;
			}
			if (configMaxPlayers.Value == 0)
			{
				mls.LogError((object)"The MaxPlayers config is null or empty, using previous method!");
				return true;
			}
			Debug.Log((object)"Connected to Master Server");
			if (flag)
			{
				if (!string.IsNullOrEmpty(text))
				{
					Debug.Log((object)("I am creating a custom open lobby named: " + text));
					RoomOptions val = new RoomOptions();
					val.CustomRoomPropertiesForLobby = new string[1] { "server_name" };
					Hashtable val2 = new Hashtable();
					((Dictionary<object, object>)val2).Add((object)"server_name", (object)("[Modded] " + text));
					val.CustomRoomProperties = val2;
					val.MaxPlayers = configMaxPlayers.Value;
					val.IsVisible = true;
					PhotonNetwork.CreateRoom((string)null, val, DataDirector.instance.customLobby, (string[])null);
					return false;
				}
				return true;
			}
			return true;
		}
	}

	[HarmonyPatch(typeof(SteamManager), "HostLobby")]
	public class HostLobbyPatch
	{
		private static bool Prefix()
		{
			HostLobbyAsync();
			return false;
		}

		private static async void HostLobbyAsync()
		{
			Debug.Log((object)"Steam: Hosting lobby...");
			Lobby? val = await SteamMatchmaking.CreateLobbyAsync(configMaxPlayers.Value);
			if (!val.HasValue)
			{
				Debug.LogError((object)"Lobby created but not correctly instantiated.");
				return;
			}
			Lobby value = val.Value;
			((Lobby)(ref value)).SetPublic();
			value = val.Value;
			((Lobby)(ref value)).SetJoinable(false);
		}
	}

	public const string modGUID = "spindles.MorePlayersImproved";

	public const string modName = "MorePlayersImproved";

	public const string modVersion = "1.0.2";

	private readonly Harmony harmony = new Harmony("spindles.MorePlayersImproved");

	public static ConfigEntry<int> configMaxPlayers;

	public static ConfigEntry<bool> configPublicLobbySupport;

	public static ManualLogSource mls;

	private void Awake()
	{
		mls = Logger.CreateLogSource("spindles.MorePlayersImproved");
		mls.LogInfo((object)"spindles.MorePlayersImproved has awoken!");
		configMaxPlayers = ((BaseUnityPlugin)this).Config.Bind<int>("General", "MaxPlayers", 10, "The max amount of players allowed in a server");
		configPublicLobbySupport = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "PublicLobbySupport", true, "Toggles if public lobby support is enabled");
		harmony.PatchAll(typeof(TryJoiningRoomPatch));
		harmony.PatchAll(typeof(HostLobbyPatch));
		mls.LogInfo((object)"spindles.MorePlayersImproved loaded main patches!");
		if (typeof(SteamManager).GetRuntimeMethod("UnlockLobby", new Type[1] { typeof(bool) }) != null)
		{
			harmony.PatchAll(typeof(OnConnectedToMasterPatch));
			mls.LogInfo((object)"spindles.MorePlayersImproved enabled PublicLobbySupport!");
		}
		mls.LogInfo((object)"spindles.MorePlayersImproved is ready now!");
	}
}

plugins/NoLimitChatbox.dll

Decompiled 2 months ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using MonoMod.RuntimeDetour;
using TMPro;
using UnityEngine;

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

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace NoLimitChatbox
{
	[BepInPlugin("nickklmao.nolimitchatbox", "No Limit Chatbox", "1.0.1")]
	internal sealed class Entry : BaseUnityPlugin
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static Action<Action<ChatManager>, ChatManager> <0>__ChatManager_AwakeHook;

			public static Manipulator <1>__ChatManager_StateActiveILHook;
		}

		private const string MOD_NAME = "No Limit Chatbox";

		internal static readonly ManualLogSource logger = Logger.CreateLogSource("No Limit Chatbox");

		private static void ChatManager_StateActiveILHook(ILContext il)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			ILCursor val = new ILCursor(il);
			val.GotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction instruction) => ILPatternMatchingExt.MatchLdcI4(instruction, 50)
			});
			val.Index -= 3;
			val.RemoveRange(29);
		}

		private static void ChatManager_AwakeHook(Action<ChatManager> orig, ChatManager self)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			orig(self);
			((TMP_Text)self.chatText).enableWordWrapping = true;
			Vector2 sizeDelta = ((TMP_Text)self.chatText).rectTransform.sizeDelta;
			sizeDelta.x = 534f;
			((TMP_Text)self.chatText).rectTransform.sizeDelta = sizeDelta;
		}

		private void Awake()
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Expected O, but got Unknown
			logger.LogDebug((object)"Hooking `ChatManager.StateActive`");
			new Hook((MethodBase)AccessTools.Method(typeof(ChatManager), "Awake", (Type[])null, (Type[])null), (Delegate)new Action<Action<ChatManager>, ChatManager>(ChatManager_AwakeHook));
			logger.LogDebug((object)"Hooking `ChatManager.StateActive`");
			MethodInfo methodInfo = AccessTools.Method(typeof(ChatManager), "StateActive", (Type[])null, (Type[])null);
			object obj = <>O.<1>__ChatManager_StateActiveILHook;
			if (obj == null)
			{
				Manipulator val = ChatManager_StateActiveILHook;
				<>O.<1>__ChatManager_StateActiveILHook = val;
				obj = (object)val;
			}
			new ILHook((MethodBase)methodInfo, (Manipulator)obj);
		}
	}
}

plugins/Omni.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
using UnityEngine.Video;

[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("")]
[assembly: AssemblyCompany("Omniscye")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("Omni")]
[assembly: AssemblyTitle("Omni")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.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;
		}
	}
}
public class VHSShaderOnItemGrab : MonoBehaviour
{
	[Header("VHS Shader")]
	public MonoBehaviour vhsShaderPrefab;

	private bool effectApplied = false;

	private PhysGrabObject physGrabObject;

	private void Start()
	{
		physGrabObject = ((Component)this).GetComponent<PhysGrabObject>();
	}

	private void Update()
	{
		if (effectApplied || (Object)(object)physGrabObject == (Object)null || !physGrabObject.grabbed)
		{
			return;
		}
		foreach (PhysGrabber item in physGrabObject.playerGrabbing)
		{
			if ((Object)(object)item?.playerAvatar != (Object)null)
			{
				AttachVHSShader(item.playerAvatar);
			}
		}
		effectApplied = true;
	}

	private void AttachVHSShader(PlayerAvatar player)
	{
		CharacterController componentInChildren = ((Component)player).GetComponentInChildren<CharacterController>(true);
		if ((Object)(object)componentInChildren == (Object)null)
		{
			Debug.LogWarning((object)"Character Controller not found under player.");
			return;
		}
		Transform val = ((Component)componentInChildren).transform.Find("Top Camera");
		if ((Object)(object)val == (Object)null)
		{
			Debug.LogWarning((object)"Top Camera not found.");
		}
		else if ((Object)(object)((Component)val).GetComponent(((object)vhsShaderPrefab).GetType()) == (Object)null)
		{
			((Component)val).gameObject.AddComponent(((object)vhsShaderPrefab).GetType());
			Debug.Log((object)"VHS Shader attached to Top Camera.");
		}
	}
}
[RequireComponent(typeof(Renderer))]
public class AudioReactiveMaterial : MonoBehaviour
{
	[Header("Audio Settings")]
	public AudioSource audioSource;

	public float sensitivity = 15f;

	[Header("Materials")]
	public Material idleMaterial;

	public Material activeMaterial;

	private Renderer rend;

	private float[] samples = new float[64];

	private void Start()
	{
		rend = ((Component)this).GetComponent<Renderer>();
		if ((Object)(object)idleMaterial != (Object)null)
		{
			rend.material = idleMaterial;
		}
	}

	private void Update()
	{
		float audioVolume = GetAudioVolume();
		float num = Mathf.Clamp01(audioVolume * sensitivity);
		if (num > 0.1f)
		{
			if ((Object)(object)activeMaterial != (Object)null)
			{
				rend.material = activeMaterial;
			}
		}
		else if ((Object)(object)idleMaterial != (Object)null)
		{
			rend.material = idleMaterial;
		}
	}

	private float GetAudioVolume()
	{
		if ((Object)(object)audioSource == (Object)null)
		{
			return 0f;
		}
		audioSource.GetOutputData(samples, 0);
		float num = 0f;
		for (int i = 0; i < samples.Length; i++)
		{
			num += Mathf.Abs(samples[i]);
		}
		return num / (float)samples.Length;
	}
}
public class OmniscyeBowlingGameManager : MonoBehaviourPun
{
	[CompilerGenerated]
	private sealed class <ResetBallAfterDelay>d__36 : IEnumerator<object>, IEnumerator, IDisposable
	{
		private int <>1__state;

		private object <>2__current;

		public OmniscyeBowlingGameManager <>4__this;

		private int <finalScore>5__1;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <ResetBallAfterDelay>d__36(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Expected O, but got Unknown
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<>4__this.isResetting = true;
				<finalScore>5__1 = <>4__this.pinsKnockedOver;
				Debug.Log((object)$"[Omniscye Bowling] Captured final score: {<finalScore>5__1}");
				<>2__current = (object)new WaitForSeconds(<>4__this.resetDelay);
				<>1__state = 1;
				return true;
			case 1:
				<>1__state = -1;
				if (PhotonNetwork.OfflineMode)
				{
					<>4__this.ResetBallRPC(<finalScore>5__1);
				}
				else
				{
					((MonoBehaviourPun)<>4__this).photonView.RPC("ResetBallRPC", (RpcTarget)3, new object[1] { <finalScore>5__1 });
				}
				<>4__this.isResetting = false;
				return false;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	[CompilerGenerated]
	private sealed class <ThrowTimeoutCheck>d__32 : IEnumerator<object>, IEnumerator, IDisposable
	{
		private int <>1__state;

		private object <>2__current;

		public OmniscyeBowlingGameManager <>4__this;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <ThrowTimeoutCheck>d__32(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<>2__current = (object)new WaitForSeconds(<>4__this.maxThrowTime);
				<>1__state = 1;
				return true;
			case 1:
				<>1__state = -1;
				if (<>4__this.throwActive)
				{
					Debug.Log((object)"[Omniscye Bowling] Throw timed out - auto finishing");
					<>4__this.FinishThrow();
				}
				return false;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	[Header("Omniscye Pins")]
	public GameObject[] pins;

	[Header("Omniscye Score Display")]
	public TextMeshProUGUI scoreText;

	public TextMeshProUGUI[] frameScoreTexts = (TextMeshProUGUI[])(object)new TextMeshProUGUI[10];

	[Header("Pin Detection Settings")]
	public float tippedAngleThreshold = 30f;

	[Header("Ball Reset Settings")]
	public Rigidbody ballRb;

	public Transform resetPosition;

	public Transform stopPoint;

	public Transform pinZoneStart;

	public Transform throwStart;

	public float resetDelay = 3f;

	public float maxThrowTime = 10f;

	public float ballStoppedThreshold = 0.05f;

	[Header("Death Mechanic")]
	public int deathScoreThreshold = 50;

	public HurtCollider playerKillCollider;

	[Header("Reward")]
	public GameObject rewardPrefab;

	public Transform rewardSpawnPoint;

	private bool isResetting = false;

	private bool ballInPinZone = false;

	private bool throwActive = false;

	private float ballStoppedTime = 0f;

	private int pinsKnockedOver = 0;

	private int throwCount = 0;

	private int currentFrame = 0;

	private List<int> throws = new List<int>();

	private Coroutine throwTimeoutCoroutine;

	private Dictionary<GameObject, Vector3> originalUpDirections = new Dictionary<GameObject, Vector3>();

	private Dictionary<GameObject, Vector3> originalPositions = new Dictionary<GameObject, Vector3>();

	private Dictionary<GameObject, Quaternion> originalRotations = new Dictionary<GameObject, Quaternion>();

	private void Start()
	{
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_006f: Unknown result type (might be due to invalid IL or missing references)
		if (!PhotonNetwork.IsConnected)
		{
			PhotonNetwork.OfflineMode = true;
			Debug.Log((object)"[Omniscye Bowling] OfflineMode enabled.");
		}
		GameObject[] array = pins;
		foreach (GameObject val in array)
		{
			originalUpDirections[val] = val.transform.up;
			originalPositions[val] = val.transform.position;
			originalRotations[val] = val.transform.rotation;
		}
		((TMP_Text)scoreText).text = "Pins Knocked Over: 0";
		for (int j = 0; j < frameScoreTexts.Length; j++)
		{
			if ((Object)(object)frameScoreTexts[j] != (Object)null)
			{
				((TMP_Text)frameScoreTexts[j]).text = $"Frame {j + 1}: ";
			}
		}
	}

	private void Update()
	{
		if ((PhotonNetwork.IsMasterClient || PhotonNetwork.OfflineMode) && !isResetting)
		{
			CheckBallPosition();
			if (throwActive && ballInPinZone)
			{
				TrackPins();
			}
			if (throwActive)
			{
				CheckIfBallStopped();
			}
		}
	}

	private void CheckIfBallStopped()
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		Vector3 velocity = ballRb.velocity;
		float magnitude = ((Vector3)(ref velocity)).magnitude;
		if (magnitude < ballStoppedThreshold)
		{
			ballStoppedTime += Time.deltaTime;
			if (ballStoppedTime >= 2f)
			{
				Debug.Log((object)"[Omniscye Bowling] Ball stopped moving - finishing throw");
				FinishThrow();
			}
		}
		else
		{
			ballStoppedTime = 0f;
		}
	}

	private void CheckBallPosition()
	{
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		float x = ((Component)ballRb).transform.position.x;
		float x2 = throwStart.position.x;
		float x3 = pinZoneStart.position.x;
		float x4 = stopPoint.position.x;
		if (!throwActive && x >= x2)
		{
			throwActive = true;
			ballStoppedTime = 0f;
			Debug.Log((object)"[Omniscye Bowling] Ball passed throw start - throw started");
			if (throwTimeoutCoroutine != null)
			{
				((MonoBehaviour)this).StopCoroutine(throwTimeoutCoroutine);
			}
			throwTimeoutCoroutine = ((MonoBehaviour)this).StartCoroutine(ThrowTimeoutCheck());
		}
		if (throwActive && !ballInPinZone && x >= x3)
		{
			ballInPinZone = true;
			Debug.Log((object)"[Omniscye Bowling] Ball entered pin zone");
		}
		if (throwActive && x >= x4)
		{
			Debug.Log((object)"[Omniscye Bowling] Ball reached stop point - finishing throw");
			FinishThrow();
		}
	}

	[IteratorStateMachine(typeof(<ThrowTimeoutCheck>d__32))]
	private IEnumerator ThrowTimeoutCheck()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <ThrowTimeoutCheck>d__32(0)
		{
			<>4__this = this
		};
	}

	private void FinishThrow()
	{
		if (!isResetting)
		{
			throwActive = false;
			ballInPinZone = false;
			if (throwTimeoutCoroutine != null)
			{
				((MonoBehaviour)this).StopCoroutine(throwTimeoutCoroutine);
				throwTimeoutCoroutine = null;
			}
			Debug.Log((object)$"[Omniscye Bowling] Throw finished with final score: {pinsKnockedOver}");
			((MonoBehaviour)this).StartCoroutine(ResetBallAfterDelay());
		}
	}

	private void TrackPins()
	{
		int num = 0;
		GameObject[] array = pins;
		foreach (GameObject val in array)
		{
			Renderer component = val.GetComponent<Renderer>();
			if ((Object)(object)component != (Object)null && component.enabled && IsPinKnockedOver(val))
			{
				num++;
			}
		}
		if (num != pinsKnockedOver)
		{
			pinsKnockedOver = num;
			if (PhotonNetwork.OfflineMode)
			{
				UpdateScoreRPC(pinsKnockedOver);
				return;
			}
			((MonoBehaviourPun)this).photonView.RPC("UpdateScoreRPC", (RpcTarget)3, new object[1] { pinsKnockedOver });
		}
	}

	private bool IsPinKnockedOver(GameObject pin)
	{
		//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_0025: Unknown result type (might be due to invalid IL or missing references)
		//IL_002c: Unknown result type (might be due to invalid IL or missing references)
		if (!originalUpDirections.ContainsKey(pin))
		{
			return false;
		}
		Vector3 val = originalUpDirections[pin];
		float num = Vector3.Angle(val, pin.transform.up);
		return num > tippedAngleThreshold;
	}

	[IteratorStateMachine(typeof(<ResetBallAfterDelay>d__36))]
	private IEnumerator ResetBallAfterDelay()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <ResetBallAfterDelay>d__36(0)
		{
			<>4__this = this
		};
	}

	[PunRPC]
	private void UpdateScoreRPC(int score)
	{
		if (throwActive && ballInPinZone)
		{
			((TMP_Text)scoreText).text = "Pins Knocked Over: " + score;
		}
	}

	[PunRPC]
	private void ResetBallRPC(int finalThrowScore)
	{
		//IL_02fd: Unknown result type (might be due to invalid IL or missing references)
		//IL_030e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0337: Unknown result type (might be due to invalid IL or missing references)
		//IL_0353: Unknown result type (might be due to invalid IL or missing references)
		throws.Add(finalThrowScore);
		throwCount++;
		if (currentFrame < 10 && (Object)(object)frameScoreTexts[currentFrame] != (Object)null)
		{
			if (throwCount % 2 == 1)
			{
				if (finalThrowScore == 10)
				{
					((TMP_Text)frameScoreTexts[currentFrame]).text = $"Frame {currentFrame + 1}: STRIKE (10)";
					throwCount++;
					currentFrame++;
					ResetPins();
					Debug.Log((object)"[Omniscye Bowling] Strike! Moving to next frame.");
				}
				else
				{
					((TMP_Text)frameScoreTexts[currentFrame]).text = $"Frame {currentFrame + 1}: {finalThrowScore}";
					HideKnockedPins();
					Debug.Log((object)$"[Omniscye Bowling] First throw: {finalThrowScore} pins. Hiding knocked pins for second throw.");
				}
			}
			else
			{
				List<int> list = throws;
				int num = list[list.Count - 2];
				int num2 = num + finalThrowScore;
				if (num2 == 10)
				{
					((TMP_Text)frameScoreTexts[currentFrame]).text = $"Frame {currentFrame + 1}: {num} / SPARE";
					Debug.Log((object)"[Omniscye Bowling] Spare achieved!");
				}
				else
				{
					((TMP_Text)frameScoreTexts[currentFrame]).text = $"Frame {currentFrame + 1}: {num} / {finalThrowScore}";
					Debug.Log((object)$"[Omniscye Bowling] Frame complete: {num} + {finalThrowScore} = {num2}");
				}
				ResetPins();
				currentFrame++;
			}
		}
		if (currentFrame >= 10)
		{
			int num3 = CalculateTotalScore();
			Debug.Log((object)$"[Omniscye Bowling] Game complete! Total score: {num3}");
			if (num3 < deathScoreThreshold)
			{
				Debug.Log((object)$"[Omniscye Bowling] Score {num3} below threshold {deathScoreThreshold} - triggering player death!");
				TriggerPlayerDeath();
			}
			else
			{
				Debug.Log((object)$"[Omniscye Bowling] Score {num3} meets threshold - rewarding players!");
				SpawnRewardPrefab();
			}
			currentFrame = 0;
			throwCount = 0;
			throws.Clear();
			for (int i = 0; i < frameScoreTexts.Length; i++)
			{
				if ((Object)(object)frameScoreTexts[i] != (Object)null)
				{
					((TMP_Text)frameScoreTexts[i]).text = $"Frame {i + 1}: ";
				}
			}
			ResetPins();
		}
		ballRb.velocity = Vector3.zero;
		ballRb.angularVelocity = Vector3.zero;
		ballRb.isKinematic = true;
		((Component)ballRb).transform.position = resetPosition.position;
		((Component)ballRb).transform.rotation = resetPosition.rotation;
		ballRb.isKinematic = false;
		pinsKnockedOver = 0;
		((TMP_Text)scoreText).text = "Pins Knocked Over: 0";
		Debug.Log((object)$"[Omniscye Bowling] Ball reset complete. Frame: {currentFrame + 1}, Throw: {throwCount % 2 + 1}");
	}

	private void SpawnRewardPrefab()
	{
		if ((Object)(object)rewardPrefab != (Object)null)
		{
			PhotonView component = rewardPrefab.GetComponent<PhotonView>();
			if ((Object)(object)component != (Object)null)
			{
				((MonoBehaviourPun)this).photonView.RPC("EnableRewardRPC", (RpcTarget)3, new object[1] { component.ViewID });
				Debug.Log((object)"[Omniscye Bowling] Sent RPC to enable reward object.");
			}
			else
			{
				Debug.LogWarning((object)"[Omniscye Bowling] Reward prefab is missing PhotonView.");
			}
		}
		else
		{
			Debug.LogWarning((object)"[Omniscye Bowling] Reward prefab not assigned.");
		}
	}

	[PunRPC]
	private void EnableRewardRPC(int viewID)
	{
		PhotonView val = PhotonView.Find(viewID);
		if ((Object)(object)val != (Object)null && (Object)(object)((Component)val).gameObject != (Object)null)
		{
			((Component)val).gameObject.SetActive(true);
			Debug.Log((object)"[Omniscye Bowling] Reward activated across all clients.");
		}
		else
		{
			Debug.LogWarning((object)"[Omniscye Bowling] Could not find reward PhotonView by ViewID.");
		}
	}

	private void ResetPins()
	{
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_005a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0066: Unknown result type (might be due to invalid IL or missing references)
		GameObject[] array = pins;
		foreach (GameObject val in array)
		{
			val.transform.position = originalPositions[val];
			val.transform.rotation = originalRotations[val];
			Rigidbody component = val.GetComponent<Rigidbody>();
			if (Object.op_Implicit((Object)(object)component))
			{
				component.velocity = Vector3.zero;
				component.angularVelocity = Vector3.zero;
			}
			Renderer component2 = val.GetComponent<Renderer>();
			Collider component3 = val.GetComponent<Collider>();
			if (Object.op_Implicit((Object)(object)component2))
			{
				component2.enabled = true;
			}
			if (Object.op_Implicit((Object)(object)component3))
			{
				component3.enabled = true;
			}
		}
		pinsKnockedOver = 0;
		Debug.Log((object)"[Omniscye Bowling] All pins reset and re-enabled");
	}

	private void HideKnockedPins()
	{
		int num = 0;
		GameObject[] array = pins;
		foreach (GameObject val in array)
		{
			if (IsPinKnockedOver(val))
			{
				Renderer component = val.GetComponent<Renderer>();
				Collider component2 = val.GetComponent<Collider>();
				if (Object.op_Implicit((Object)(object)component))
				{
					component.enabled = false;
				}
				if (Object.op_Implicit((Object)(object)component2))
				{
					component2.enabled = false;
				}
				num++;
			}
		}
		Debug.Log((object)$"[Omniscye Bowling] Hidden {num} knocked pins for second throw");
	}

	private int CalculateTotalScore()
	{
		int num = 0;
		foreach (int @throw in throws)
		{
			num += @throw;
		}
		return num;
	}

	private void TriggerPlayerDeath()
	{
		if ((Object)(object)playerKillCollider == (Object)null)
		{
			Debug.LogError((object)"[Omniscye Bowling] No HurtCollider assigned for player death!");
			return;
		}
		PlayerAvatar[] array = Object.FindObjectsOfType<PlayerAvatar>();
		PlayerAvatar[] array2 = array;
		foreach (PlayerAvatar val in array2)
		{
			if ((Object)(object)val != (Object)null && (Object)(object)val.playerHealth != (Object)null)
			{
				Debug.Log((object)("[Omniscye Bowling] Killing player: " + ((Object)val).name));
				int num = ((!((Object)(object)playerKillCollider.enemyHost != (Object)null)) ? (-1) : 0);
				val.playerHealth.Hurt(val.playerHealth.health, false, num);
			}
		}
	}
}
public class ChasingSkullValuable : Trap
{
	[Header("Chase Settings")]
	public float forceStrength = 50f;

	public float maxSpeed = 15f;

	public float detectionRange = 30f;

	public float playerKnockbackForce = 25f;

	[Header("Physics")]
	public Rigidbody rb;

	private PlayerAvatar targetPlayer;

	public override void Start()
	{
		((Trap)this).Start();
		if ((Object)(object)rb == (Object)null)
		{
			rb = ((Component)this).GetComponent<Rigidbody>();
		}
	}

	public override void Update()
	{
		((Trap)this).Update();
		if (!base.physGrabObject.grabbed)
		{
			FindPlayerTarget();
			ChaseTarget();
		}
		else
		{
			targetPlayer = null;
		}
	}

	private void FindPlayerTarget()
	{
		//IL_005f: Unknown result type (might be due to invalid IL or missing references)
		//IL_006b: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)targetPlayer != (Object)null && !targetPlayer.isDisabled)
		{
			return;
		}
		float num = detectionRange;
		PlayerAvatar val = null;
		foreach (PlayerAvatar item in SemiFunc.PlayerGetList())
		{
			if (!item.isDisabled)
			{
				float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)item).transform.position);
				if (num2 < num)
				{
					num = num2;
					val = item;
				}
			}
		}
		targetPlayer = val;
	}

	private void ChaseTarget()
	{
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_003e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0052: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: Unknown result type (might be due to invalid IL or missing references)
		//IL_0079: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)targetPlayer == (Object)null) && !targetPlayer.isDisabled)
		{
			Vector3 val = ((Component)targetPlayer).transform.position - ((Component)this).transform.position;
			Vector3 normalized = ((Vector3)(ref val)).normalized;
			val = rb.velocity;
			if (((Vector3)(ref val)).magnitude < maxSpeed)
			{
				rb.AddForce(normalized * forceStrength, (ForceMode)5);
			}
		}
	}

	private void OnCollisionEnter(Collision collision)
	{
		//IL_004c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_0065: Unknown result type (might be due to invalid IL or missing references)
		//IL_006a: 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_0078: Unknown result type (might be due to invalid IL or missing references)
		if (SemiFunc.IsMasterClientOrSingleplayer())
		{
			PlayerAvatar componentInParent = ((Component)collision.collider).GetComponentInParent<PlayerAvatar>();
			if ((Object)(object)componentInParent != (Object)null && !componentInParent.isDisabled)
			{
				componentInParent.tumble.TumbleRequest(true, false);
				Vector3 val = ((Component)componentInParent).transform.position - ((Component)this).transform.position;
				Vector3 normalized = ((Vector3)(ref val)).normalized;
				componentInParent.tumble.TumbleForce(normalized * playerKnockbackForce);
				componentInParent.tumble.TumbleOverrideTime(1.5f);
			}
		}
	}
}
public class CoasterSeatCarrier : MonoBehaviour
{
	[Tooltip("Child under the cart where the player sits (must be parented)")]
	public Transform seatPoint;

	[Header("Grab & Follow Settings")]
	[Tooltip("How close the player must be to latch on")]
	public float grabDistance = 1f;

	[Tooltip("Spring stiffness for position follow")]
	public float positionStiffness = 10f;

	[Tooltip("Spring stiffness for rotation follow")]
	public float rotationStiffness = 0.2f;

	private PlayerAvatar playerTarget;

	private void FixedUpdate()
	{
		//IL_0125: Unknown result type (might be due to invalid IL or missing references)
		//IL_0130: Unknown result type (might be due to invalid IL or missing references)
		//IL_0137: Unknown result type (might be due to invalid IL or missing references)
		//IL_0142: Unknown result type (might be due to invalid IL or missing references)
		//IL_0147: Unknown result type (might be due to invalid IL or missing references)
		//IL_014b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0159: Unknown result type (might be due to invalid IL or missing references)
		//IL_017b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0188: Unknown result type (might be due to invalid IL or missing references)
		//IL_018d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0191: Unknown result type (might be due to invalid IL or missing references)
		//IL_0198: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)playerTarget == (Object)null)
		{
			foreach (PlayerAvatar item in SemiFunc.PlayerGetList())
			{
				if (item.isDisabled || !(Vector3.Distance(seatPoint.position, ((Component)item).transform.position) <= grabDistance))
				{
					continue;
				}
				playerTarget = item;
				break;
			}
		}
		if ((Object)(object)playerTarget != (Object)null && !playerTarget.isDisabled)
		{
			Rigidbody rb = playerTarget.tumble.rb;
			if (!playerTarget.tumble.isTumbling)
			{
				playerTarget.tumble.TumbleRequest(true, false);
			}
			playerTarget.tumble.TumbleOverrideTime(1f);
			playerTarget.FallDamageResetSet(0.1f);
			Vector3 val = SemiFunc.PhysFollowPosition(((Component)playerTarget.tumble).transform.position, seatPoint.position, rb.velocity, positionStiffness);
			rb.AddForce(val * (positionStiffness * Time.fixedDeltaTime), (ForceMode)1);
			Vector3 val2 = SemiFunc.PhysFollowRotation(((Component)playerTarget.tumble).transform, seatPoint.rotation, rb, rotationStiffness);
			rb.AddTorque(val2 * Time.fixedDeltaTime, (ForceMode)1);
		}
	}
}
[RequireComponent(typeof(Renderer))]
public class CubeWalk : MonoBehaviour
{
	[CompilerGenerated]
	private sealed class <FlipRight>d__13 : IEnumerator<object>, IEnumerator, IDisposable
	{
		private int <>1__state;

		private object <>2__current;

		public CubeWalk <>4__this;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <FlipRight>d__13(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Expected O, but got Unknown
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				break;
			case 1:
				<>1__state = -1;
				if (!<>4__this.isFlipping)
				{
					<>4__this.isFlipping = true;
					((MonoBehaviour)<>4__this).StartCoroutine(<>4__this.PerformFlip());
				}
				break;
			}
			<>2__current = (object)new WaitForSeconds(<>4__this.flipDelay);
			<>1__state = 1;
			return true;
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	[CompilerGenerated]
	private sealed class <PerformFlip>d__14 : IEnumerator<object>, IEnumerator, IDisposable
	{
		private int <>1__state;

		private object <>2__current;

		public CubeWalk <>4__this;

		private float <rotationAmount>5__1;

		private float <rotationSpeed>5__2;

		private float <totalRotation>5__3;

		private Vector3 <rightAngleRotation>5__4;

		private float <step>5__5;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <PerformFlip>d__14(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_013d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			//IL_018a: Unknown result type (might be due to invalid IL or missing references)
			//IL_019a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<rotationAmount>5__1 = 90f;
				<rotationSpeed>5__2 = <rotationAmount>5__1 / <>4__this.flipDelay * Time.deltaTime;
				<totalRotation>5__3 = 0f;
				break;
			case 1:
				<>1__state = -1;
				break;
			}
			if (<totalRotation>5__3 < <rotationAmount>5__1)
			{
				<step>5__5 = Mathf.Min(<rotationSpeed>5__2, <rotationAmount>5__1 - <totalRotation>5__3);
				((Component)<>4__this).transform.RotateAround(<>4__this.pivot, <>4__this.rotationAxis, <step>5__5);
				<totalRotation>5__3 += <step>5__5;
				<>2__current = null;
				<>1__state = 1;
				return true;
			}
			<rightAngleRotation>5__4 = new Vector3(Mathf.Round(((Component)<>4__this).transform.eulerAngles.x / 90f) * 90f, Mathf.Round(((Component)<>4__this).transform.eulerAngles.y / 90f) * 90f, Mathf.Round(((Component)<>4__this).transform.eulerAngles.z / 90f) * 90f);
			((Component)<>4__this).transform.eulerAngles = <rightAngleRotation>5__4;
			<>4__this.pivot = ((Component)<>4__this).transform.position + new Vector3(((Component)<>4__this).transform.localScale.x / 2f, (0f - ((Component)<>4__this).transform.localScale.y) / 2f, ((Component)<>4__this).transform.localScale.z / 2f);
			<>4__this.isFlipping = false;
			return false;
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	[Header("Flip Settings")]
	public float flipDelay = 0.5f;

	[Header("Audio Settings")]
	public AudioSource audioSource;

	public float sensitivity = 15f;

	[Header("Materials")]
	public Material blackMaterial;

	public Material redMaterial;

	private Vector3 pivot;

	private bool isFlipping = false;

	private Vector3 rotationAxis = new Vector3(0f, 0f, -1f);

	private Renderer rend;

	private float[] samples = new float[64];

	private void Start()
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		//IL_0055: Unknown result type (might be due to invalid IL or missing references)
		//IL_005a: Unknown result type (might be due to invalid IL or missing references)
		pivot = ((Component)this).transform.position + new Vector3(((Component)this).transform.localScale.x / 2f, (0f - ((Component)this).transform.localScale.y) / 2f, ((Component)this).transform.localScale.z / 2f);
		rend = ((Component)this).GetComponent<Renderer>();
		rend.material = blackMaterial;
		((MonoBehaviour)this).StartCoroutine(FlipRight());
	}

	private void Update()
	{
		float audioVolume = GetAudioVolume();
		float num = Mathf.Clamp01(audioVolume * sensitivity);
		if (num > 0.1f)
		{
			rend.material = redMaterial;
		}
		else
		{
			rend.material = blackMaterial;
		}
	}

	private float GetAudioVolume()
	{
		if ((Object)(object)audioSource == (Object)null)
		{
			return 0f;
		}
		audioSource.GetOutputData(samples, 0);
		float num = 0f;
		for (int i = 0; i < samples.Length; i++)
		{
			num += Mathf.Abs(samples[i]);
		}
		return num / (float)samples.Length;
	}

	[IteratorStateMachine(typeof(<FlipRight>d__13))]
	private IEnumerator FlipRight()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <FlipRight>d__13(0)
		{
			<>4__this = this
		};
	}

	[IteratorStateMachine(typeof(<PerformFlip>d__14))]
	private IEnumerator PerformFlip()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <PerformFlip>d__14(0)
		{
			<>4__this = this
		};
	}
}
public class CursedFollowCat : MonoBehaviourPun
{
	public float followDistance = 50f;

	public float moveForce = 20f;

	public float rotationForce = 5f;

	public float toppleAngleThreshold = 45f;

	public float resetAfterSeconds = 5f;

	private PlayerAvatar playerTarget;

	private Rigidbody rb;

	private float toppleTimer = 0f;

	private void Start()
	{
		rb = ((Component)this).GetComponent<Rigidbody>();
	}

	private void FixedUpdate()
	{
		if (SemiFunc.IsMasterClientOrSingleplayer())
		{
			AcquirePlayerTarget();
			if ((Object)(object)playerTarget != (Object)null && !playerTarget.isDisabled)
			{
				FollowPlayer();
			}
			CheckForTopple();
		}
	}

	private void AcquirePlayerTarget()
	{
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0045: Unknown result type (might be due to invalid IL or missing references)
		float num = followDistance;
		playerTarget = null;
		foreach (PlayerAvatar item in SemiFunc.PlayerGetList())
		{
			if (!item.isDisabled)
			{
				float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)item).transform.position);
				if (num2 <= num)
				{
					num = num2;
					playerTarget = item;
				}
			}
		}
	}

	private void FollowPlayer()
	{
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_002f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0048: Unknown result type (might be due to invalid IL or missing references)
		//IL_005f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0066: Unknown result type (might be due to invalid IL or missing references)
		//IL_006b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0070: Unknown result type (might be due to invalid IL or missing references)
		//IL_0081: Unknown result type (might be due to invalid IL or missing references)
		//IL_0086: Unknown result type (might be due to invalid IL or missing references)
		//IL_008d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0093: Unknown result type (might be due to invalid IL or missing references)
		Vector3 position = ((Component)playerTarget).transform.position;
		Vector3 val = SemiFunc.PhysFollowPosition(rb.position, position, rb.velocity, moveForce);
		rb.AddForce(val * (moveForce * Time.fixedDeltaTime), (ForceMode)1);
		Vector3 val2 = SemiFunc.PhysFollowRotation(((Component)rb).transform, Quaternion.LookRotation(position - ((Component)this).transform.position), rb, rotationForce);
		rb.AddTorque(val2 * Time.fixedDeltaTime, (ForceMode)1);
	}

	private void CheckForTopple()
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		float num = Vector3.Angle(((Component)this).transform.up, Vector3.up);
		if (num > toppleAngleThreshold)
		{
			toppleTimer += Time.fixedDeltaTime;
			if (toppleTimer >= resetAfterSeconds)
			{
				ResetUpright();
				toppleTimer = 0f;
			}
		}
		else
		{
			toppleTimer = 0f;
		}
	}

	private void ResetUpright()
	{
		//IL_0012: 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_0032: 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)
		((Component)this).transform.rotation = Quaternion.Euler(0f, ((Component)this).transform.eulerAngles.y, 0f);
		rb.angularVelocity = Vector3.zero;
		rb.velocity = Vector3.zero;
	}
}
public class CursedBlackHoleOrbValuable : Trap
{
	[Header("Black Hole Settings")]
	public float blackHoleRange = 20f;

	public float pullForce = 100f;

	public override void Update()
	{
		((Trap)this).Update();
		if (base.physGrabObject.grabbed && SemiFunc.IsMasterClientOrSingleplayer())
		{
			ApplyContinuousPull();
		}
	}

	private void ApplyContinuousPull()
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0092: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ce: 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_010a: Unknown result type (might be due to invalid IL or missing references)
		//IL_010e: Unknown result type (might be due to invalid IL or missing references)
		Vector3 position = ((Component)this).transform.position;
		foreach (PlayerAvatar item in SemiFunc.PlayerGetList())
		{
			bool flag = false;
			foreach (PhysGrabber item2 in base.physGrabObject.playerGrabbing)
			{
				if ((Object)(object)item2.playerAvatar == (Object)(object)item)
				{
					flag = true;
					break;
				}
			}
			if (!flag && !item.isDisabled)
			{
				float num = Vector3.Distance(position, ((Component)item).transform.position);
				if (num <= blackHoleRange)
				{
					Vector3 val = position - ((Component)item).transform.position;
					Vector3 normalized = ((Vector3)(ref val)).normalized;
					item.tumble.TumbleRequest(true, false);
					float num2 = Mathf.Clamp01(1f - num / blackHoleRange);
					float num3 = pullForce * num2;
					item.tumble.TumbleForce(normalized * num3);
					item.tumble.TumbleOverrideTime(0.2f);
				}
			}
		}
	}
}
public class CursedRollerValuable : MonoBehaviour
{
	[Header("Patrol Settings")]
	public float moveForce = 15f;

	public float rotationForce = 5f;

	public float wanderInterval = 5f;

	public float wanderRadius = 10f;

	[Header("Coaster Settings")]
	public Transform seatPoint;

	public float grabDistance = 1f;

	public float positionStiffness = 10f;

	public float rotationStiffness = 0.2f;

	public float latchDuration = 5f;

	public float tossForce = 30f;

	public float regrabCooldown = 5f;

	private PlayerAvatar playerTarget;

	private Rigidbody rb;

	private float wanderTimer = 0f;

	private Vector3 randomWanderTarget;

	private float latchTimer = 0f;

	private float regrabTimer = 0f;

	private void Start()
	{
		rb = ((Component)this).GetComponent<Rigidbody>();
		SetRandomWanderTarget();
	}

	private void FixedUpdate()
	{
		//IL_008b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0097: Unknown result type (might be due to invalid IL or missing references)
		if (!SemiFunc.IsMasterClientOrSingleplayer())
		{
			return;
		}
		if (regrabTimer > 0f)
		{
			regrabTimer -= Time.fixedDeltaTime;
		}
		if ((Object)(object)playerTarget == (Object)null && regrabTimer <= 0f)
		{
			foreach (PlayerAvatar item in SemiFunc.PlayerGetList())
			{
				if (item.isDisabled || !(Vector3.Distance(seatPoint.position, ((Component)item).transform.position) <= grabDistance))
				{
					continue;
				}
				playerTarget = item;
				latchTimer = 0f;
				break;
			}
		}
		if ((Object)(object)playerTarget != (Object)null)
		{
			CarryPlayer();
			latchTimer += Time.fixedDeltaTime;
			if (latchTimer >= latchDuration)
			{
				TossPlayer();
				playerTarget = null;
				latchTimer = 0f;
				regrabTimer = regrabCooldown;
				SetRandomWanderTarget();
			}
		}
		else
		{
			wanderTimer += Time.fixedDeltaTime;
			if (wanderTimer >= wanderInterval)
			{
				wanderTimer = 0f;
				SetRandomWanderTarget();
			}
			MoveToWanderTarget();
		}
	}

	private void CarryPlayer()
	{
		//IL_0073: 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_0084: Unknown result type (might be due to invalid IL or missing references)
		//IL_008f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0094: 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)
		//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00de: Unknown result type (might be due to invalid IL or missing references)
		Rigidbody val = playerTarget.tumble.rb;
		if (!playerTarget.tumble.isTumbling)
		{
			playerTarget.tumble.TumbleRequest(true, false);
		}
		playerTarget.tumble.TumbleOverrideTime(1f);
		playerTarget.FallDamageResetSet(0.1f);
		Vector3 val2 = SemiFunc.PhysFollowPosition(((Component)playerTarget.tumble).transform.position, seatPoint.position, val.velocity, positionStiffness);
		val.AddForce(val2 * (positionStiffness * Time.fixedDeltaTime), (ForceMode)1);
		Vector3 val3 = SemiFunc.PhysFollowRotation(((Component)playerTarget.tumble).transform, seatPoint.rotation, val, rotationStiffness);
		val.AddTorque(val3 * Time.fixedDeltaTime, (ForceMode)1);
	}

	private void TossPlayer()
	{
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_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_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		//IL_0048: 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)
		Vector3 val = ((Component)playerTarget).transform.position - ((Component)this).transform.position;
		Vector3 normalized = ((Vector3)(ref val)).normalized;
		playerTarget.tumble.TumbleRequest(true, false);
		playerTarget.tumble.TumbleForce(normalized * tossForce);
		playerTarget.tumble.TumbleOverrideTime(1f);
	}

	private void SetRandomWanderTarget()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_001e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		//IL_002f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		Vector2 val = Random.insideUnitCircle * wanderRadius;
		randomWanderTarget = ((Component)this).transform.position + new Vector3(val.x, 0f, val.y);
	}

	private void MoveToWanderTarget()
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: Unknown result type (might be due to invalid IL or missing references)
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_0028: Unknown result type (might be due to invalid IL or missing references)
		//IL_002f: Unknown result type (might be due to invalid IL or missing references)
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_005f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0064: 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_007a: Unknown result type (might be due to invalid IL or missing references)
		//IL_007f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0086: Unknown result type (might be due to invalid IL or missing references)
		//IL_008c: Unknown result type (might be due to invalid IL or missing references)
		Vector3 val = SemiFunc.PhysFollowPosition(rb.position, randomWanderTarget, rb.velocity, moveForce);
		rb.AddForce(val * (moveForce * Time.fixedDeltaTime), (ForceMode)1);
		Vector3 val2 = SemiFunc.PhysFollowRotation(((Component)rb).transform, Quaternion.LookRotation(randomWanderTarget - ((Component)this).transform.position), rb, rotationForce);
		rb.AddTorque(val2 * Time.fixedDeltaTime, (ForceMode)1);
	}
}
public class FallTeleportTrigger : MonoBehaviour
{
	public float fallYThreshold = -100f;

	public Transform teleportTarget;

	private PlayerAvatar localPlayer;

	private void Start()
	{
		localPlayer = ((IEnumerable<PlayerAvatar>)GameDirector.instance.PlayerList).FirstOrDefault((Func<PlayerAvatar, bool>)((PlayerAvatar p) => p.photonView.IsMine || !PhotonNetwork.InRoom));
	}

	private void Update()
	{
		//IL_0063: Unknown result type (might be due to invalid IL or missing references)
		//IL_0069: Invalid comparison between Unknown and I4
		//IL_0082: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
		//IL_0105: Unknown result type (might be due to invalid IL or missing references)
		//IL_011c: Unknown result type (might be due to invalid IL or missing references)
		if (Object.op_Implicit((Object)(object)LevelGenerator.Instance) && LevelGenerator.Instance.Generated && Object.op_Implicit((Object)(object)localPlayer) && Object.op_Implicit((Object)(object)teleportTarget) && SemiFunc.IsMasterClientOrSingleplayer() && (int)GameDirector.instance.currentState == 2 && ((Component)localPlayer).transform.position.y < fallYThreshold)
		{
			PlayerTumble tumble = localPlayer.tumble;
			if ((Object)(object)tumble != (Object)null && (Object)(object)tumble.physGrabObject != (Object)null)
			{
				tumble.TumbleSet(true, false);
				tumble.physGrabObject.Teleport(teleportTarget.position, teleportTarget.rotation);
				tumble.physGrabObject.rb.velocity = Vector3.zero;
				tumble.physGrabObject.rb.angularVelocity = Vector3.zero;
				localPlayer.FallDamageResetSet(2f);
			}
		}
	}
}
public class GreedyVendingTrap : MonoBehaviourPun
{
	[CompilerGenerated]
	private sealed class <PressCooldown>d__10 : IEnumerator<object>, IEnumerator, IDisposable
	{
		private int <>1__state;

		private object <>2__current;

		public GreedyVendingTrap <>4__this;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <PressCooldown>d__10(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Expected O, but got Unknown
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<>4__this.recentlyPressed = true;
				<>2__current = (object)new WaitForSeconds(<>4__this.cooldown);
				<>1__state = 1;
				return true;
			case 1:
				<>1__state = -1;
				<>4__this.recentlyPressed = false;
				return false;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	private ItemToggle itemToggle;

	private bool warned = false;

	private bool recentlyPressed = false;

	public AudioClip warningClip;

	public AudioSource audioSource;

	public Animator warningAnimator;

	public string animationTriggerName = "Warn";

	public float cooldown = 0.5f;

	private void Start()
	{
		itemToggle = ((Component)this).GetComponent<ItemToggle>();
	}

	private void Update()
	{
		if (!itemToggle.toggleImpulse || recentlyPressed)
		{
			return;
		}
		((MonoBehaviour)this).StartCoroutine(PressCooldown());
		if (!warned)
		{
			warned = true;
			if ((Object)(object)warningClip != (Object)null && (Object)(object)audioSource != (Object)null)
			{
				audioSource.PlayOneShot(warningClip);
			}
			if ((Object)(object)warningAnimator != (Object)null)
			{
				warningAnimator.SetTrigger(animationTriggerName);
			}
			Debug.Log((object)"[Trap] First press - warning issued.");
		}
		else
		{
			Debug.Log((object)"[Trap] Second press - punishing all players.");
			KillAllPlayers();
		}
	}

	[IteratorStateMachine(typeof(<PressCooldown>d__10))]
	private IEnumerator PressCooldown()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <PressCooldown>d__10(0)
		{
			<>4__this = this
		};
	}

	private void KillAllPlayers()
	{
		PlayerAvatar[] array = Object.FindObjectsOfType<PlayerAvatar>();
		PlayerAvatar[] array2 = array;
		foreach (PlayerAvatar val in array2)
		{
			if ((Object)(object)val != (Object)null && (Object)(object)val.playerHealth != (Object)null)
			{
				int num = -1;
				val.playerHealth.Hurt(val.playerHealth.health, false, num);
			}
		}
	}
}
[RequireComponent(typeof(Collider))]
public class KinematicCoasterMover : MonoBehaviour
{
	[Header("Waypoints & Timing")]
	public Transform waypointRoot;

	public float speed = 5f;

	public float startDelay = 10f;

	public bool loop = true;

	public float rotationSpeed = 5f;

	[Header("Mesh Import Rotation Correction (tweak in Inspector)")]
	public Vector3 meshEulerOffset = new Vector3(-90f, 180f, -0.085f);

	private Transform[] waypoints;

	private int idx;

	private float delayTimer;

	private bool started;

	private Quaternion originalRotation;

	private Quaternion meshOffsetQuat;

	private static readonly Regex regex = new Regex("Waypoint_(\\d+)$");

	private void Awake()
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_0100: Unknown result type (might be due to invalid IL or missing references)
		originalRotation = ((Component)this).transform.rotation;
		waypoints = (from t in ((Component)waypointRoot).GetComponentsInChildren<Transform>(true)
			where regex.IsMatch(((Object)t).name)
			select new
			{
				t = t,
				i = int.Parse(regex.Match(((Object)t).name).Groups[1].Value)
			} into x
			orderby x.i
			select x.t).ToArray();
		meshOffsetQuat = Quaternion.Euler(meshEulerOffset);
		idx = 0;
		delayTimer = startDelay;
		started = false;
		if (waypoints.Length != 0)
		{
			((Component)this).transform.position = waypoints[0].position;
		}
	}

	private void Update()
	{
		//IL_0048: Unknown result type (might be due to invalid IL or missing references)
		//IL_0083: Unknown result type (might be due to invalid IL or missing references)
		//IL_0089: Unknown result type (might be due to invalid IL or missing references)
		//IL_0109: Unknown result type (might be due to invalid IL or missing references)
		//IL_010e: Unknown result type (might be due to invalid IL or missing references)
		//IL_010f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0116: Unknown result type (might be due to invalid IL or missing references)
		//IL_011b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0120: 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_00bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c9: 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_00d2: 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)
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00db: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
		//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_00f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_0161: Unknown result type (might be due to invalid IL or missing references)
		//IL_0168: Unknown result type (might be due to invalid IL or missing references)
		//IL_016e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0173: Unknown result type (might be due to invalid IL or missing references)
		//IL_0180: Unknown result type (might be due to invalid IL or missing references)
		//IL_0185: Unknown result type (might be due to invalid IL or missing references)
		//IL_018a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0190: Unknown result type (might be due to invalid IL or missing references)
		//IL_0195: Unknown result type (might be due to invalid IL or missing references)
		//IL_019a: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bb: 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)
		if (waypoints == null || waypoints.Length == 0)
		{
			return;
		}
		if (!started)
		{
			delayTimer -= Time.deltaTime;
			((Component)this).transform.rotation = originalRotation;
			if (delayTimer <= 0f)
			{
				started = true;
			}
			return;
		}
		if (idx == 0 && ((Component)this).transform.rotation == originalRotation && waypoints.Length > 1)
		{
			Vector3 val = waypoints[1].position - waypoints[0].position;
			Vector3 normalized = ((Vector3)(ref val)).normalized;
			Quaternion rotation = Quaternion.LookRotation(normalized, Vector3.up) * meshOffsetQuat;
			((Component)this).transform.rotation = rotation;
		}
		Vector3 position = waypoints[idx].position;
		Vector3 val2 = position - ((Component)this).transform.position;
		float num = speed * Time.deltaTime;
		if (((Vector3)(ref val2)).magnitude <= num)
		{
			((Component)this).transform.position = position;
			AdvanceIndex();
			return;
		}
		Transform transform = ((Component)this).transform;
		transform.position += ((Vector3)(ref val2)).normalized * num;
		Quaternion val3 = Quaternion.LookRotation(((Vector3)(ref val2)).normalized, Vector3.up) * meshOffsetQuat;
		((Component)this).transform.rotation = Quaternion.Slerp(((Component)this).transform.rotation, val3, rotationSpeed * Time.deltaTime);
	}

	private void AdvanceIndex()
	{
		//IL_0053: Unknown result type (might be due to invalid IL or missing references)
		idx++;
		if (idx >= waypoints.Length)
		{
			if (loop)
			{
				idx = 0;
				delayTimer = startDelay;
				started = false;
				((Component)this).transform.rotation = originalRotation;
			}
			else
			{
				((Behaviour)this).enabled = false;
			}
		}
	}

	private void OnDrawGizmos()
	{
		//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)waypointRoot == (Object)null))
		{
			Vector3[] array = (from t in ((Component)waypointRoot).GetComponentsInChildren<Transform>(true)
				where regex.IsMatch(((Object)t).name)
				select new
				{
					p = t.position,
					i = int.Parse(regex.Match(((Object)t).name).Groups[1].Value)
				} into x
				orderby x.i
				select x.p).ToArray();
			Gizmos.color = Color.cyan;
			for (int i = 0; i + 1 < array.Length; i++)
			{
				Gizmos.DrawLine(array[i], array[i + 1]);
			}
		}
	}
}
public class LowGravityValuable : MonoBehaviour
{
	private PhotonView photonView;

	private bool gravitySet = false;

	private void Start()
	{
		photonView = ((Component)this).GetComponent<PhotonView>();
		if (SemiFunc.IsMasterClientOrSingleplayer())
		{
			ApplyLowGravity();
		}
	}

	private void ApplyLowGravity()
	{
		//IL_001c: Unknown result type (might be due to invalid IL or missing references)
		if (!gravitySet)
		{
			Physics.gravity = new Vector3(0f, -1.2f, 0f);
			gravitySet = true;
			Debug.Log((object)"[LowGravityValuable] Gravity set to low space mode.");
		}
	}
}
public class CursedMusicBoxValuable : Trap
{
	[Header("Audio")]
	public Sound cursedMusicSound;

	[Header("Spin Settings")]
	public float spinForce = 50f;

	public float tumbleForce = 15f;

	public float spinInterval = 0.2f;

	[Header("Visual Effects")]
	public ParticleSystem curseSparks;

	public Light curseLight;

	[Header("Animator")]
	public Animator cursedAnimator;

	public string holdBoolParameter = "IsHeld";

	[Header("Camera Shake")]
	public float cameraShakeTime = 0.2f;

	public float cameraShakeStrength = 3f;

	public Vector2 cameraShakeBounds = new Vector2(1.5f, 5f);

	private float spinTimer;

	private Rigidbody rb;

	private bool soundPlaying = false;

	public override void Start()
	{
		((Trap)this).Start();
		rb = ((Component)this).GetComponent<Rigidbody>();
		if ((Object)(object)curseLight != (Object)null)
		{
			((Behaviour)curseLight).enabled = false;
		}
	}

	public override void Update()
	{
		((Trap)this).Update();
		if (SemiFunc.IsMasterClientOrSingleplayer())
		{
			CheckForGrabTumble();
		}
		HandleGrabAnimation();
	}

	private void CheckForGrabTumble()
	{
		if (!SemiFunc.FPSImpulse15() && base.physGrabObject.grabbed)
		{
			ActivateCurseEffects();
			{
				foreach (PhysGrabber item in base.physGrabObject.playerGrabbing)
				{
					SpinAndTumblePlayer(item.playerAvatar);
				}
				return;
			}
		}
		StopCurseEffects();
	}

	private void ActivateCurseEffects()
	{
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		if (!soundPlaying)
		{
			cursedMusicSound.Play(base.physGrabObject.centerPoint, 1f, 1f, 1f, 1f);
			soundPlaying = true;
		}
		if ((Object)(object)curseLight != (Object)null)
		{
			((Behaviour)curseLight).enabled = true;
		}
		if ((Object)(object)curseSparks != (Object)null && !curseSparks.isPlaying)
		{
			curseSparks.Play();
		}
	}

	private void StopCurseEffects()
	{
		if (soundPlaying)
		{
			cursedMusicSound.Stop();
			soundPlaying = false;
		}
		if ((Object)(object)curseLight != (Object)null)
		{
			((Behaviour)curseLight).enabled = false;
		}
		if ((Object)(object)curseSparks != (Object)null && curseSparks.isPlaying)
		{
			curseSparks.Stop();
		}
	}

	private void SpinAndTumblePlayer(PlayerAvatar player)
	{
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_006d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0103: Unknown result type (might be due to invalid IL or missing references)
		spinTimer += Time.deltaTime;
		if (spinTimer >= spinInterval)
		{
			spinTimer = 0f;
			player.tumble.TumbleRequest(true, false);
			player.tumble.TumbleForce(((Component)player).transform.forward * tumbleForce);
			player.tumble.TumbleTorque(Vector3.up * spinForce);
			player.tumble.TumbleOverrideTime(2f);
			player.tumble.ImpactHurtSet(1f, 5);
			GameDirector.instance.CameraShake.ShakeDistance(cameraShakeStrength, 3f, 8f, ((Component)this).transform.position, cameraShakeTime);
			GameDirector.instance.CameraImpact.ShakeDistance(cameraShakeStrength, cameraShakeBounds.x, cameraShakeBounds.y, ((Component)this).transform.position, cameraShakeTime);
		}
	}

	private void HandleGrabAnimation()
	{
		if (!((Object)(object)cursedAnimator == (Object)null))
		{
			bool grabbed = base.physGrabObject.grabbed;
			cursedAnimator.SetBool(holdBoolParameter, grabbed);
		}
	}
}
public class OmniPlinkoInstaller : MonoBehaviour
{
	[CompilerGenerated]
	private sealed class <InstallSequence>d__14 : IEnumerator<object>, IEnumerator, IDisposable
	{
		private int <>1__state;

		private object <>2__current;

		public OmniPlinkoInstaller <>4__this;

		private float <progress>5__1;

		private int <msgIndex>5__2;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <InstallSequence>d__14(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ae: Expected O, but got Unknown
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_0153: Expected O, but got Unknown
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				if ((Object)(object)<>4__this.disableOnStart != (Object)null)
				{
					<>4__this.disableOnStart.SetActive(false);
				}
				((Component)<>4__this.startButton).gameObject.SetActive(false);
				<>4__this.bgm.Play();
				<progress>5__1 = 0f;
				<msgIndex>5__2 = 0;
				goto IL_0164;
			case 1:
				<>1__state = -1;
				goto IL_0164;
			case 2:
				{
					<>1__state = -1;
					<>4__this.rootCanvas.SetActive(false);
					Debug.Log((object)"Omni-OS fully initialized. Canvas off.");
					return false;
				}
				IL_0164:
				if (<progress>5__1 < 100f)
				{
					<progress>5__1 += Random.Range(1f, 4f);
					<>4__this.progressBar.value = <progress>5__1 / 100f;
					if (<progress>5__1 >= (float)(<msgIndex>5__2 + 1) * (100f / (float)<>4__this.messages.Length) && <msgIndex>5__2 < <>4__this.messages.Length)
					{
						((TMP_Text)<>4__this.statusText).text = <>4__this.messages[<msgIndex>5__2++];
					}
					<>2__current = (object)new WaitForSeconds(0.3f);
					<>1__state = 1;
					return true;
				}
				<>4__this.installerUI.SetActive(false);
				<>4__this.loadedUI.SetActive(true);
				<>2__current = (object)new WaitForSeconds(3f);
				<>1__state = 2;
				return true;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	[CompilerGenerated]
	private sealed class <PressCooldown>d__13 : IEnumerator<object>, IEnumerator, IDisposable
	{
		private int <>1__state;

		private object <>2__current;

		public OmniPlinkoInstaller <>4__this;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <PressCooldown>d__13(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Expected O, but got Unknown
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<>4__this.recentlyPressed = true;
				<>2__current = (object)new WaitForSeconds(0.5f);
				<>1__state = 1;
				return true;
			case 1:
				<>1__state = -1;
				<>4__this.recentlyPressed = false;
				return false;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	[Header("UI Elements")]
	public GameObject rootCanvas;

	public GameObject installerUI;

	public GameObject loadedUI;

	public Slider progressBar;

	public TextMeshProUGUI statusText;

	public Button startButton;

	public AudioSource bgm;

	[Header("Setup Control")]
	public GameObject disableOnStart;

	private ItemToggle itemToggle;

	private bool recentlyPressed = false;

	private readonly string[] messages = new string[6] { "Initializing Installer...", "Decrypting Payload...", "Installing Omni-Kernel...", "Configuring Quantum Drivers...", "Patching BIOS...", "Finalizing Setup..." };

	private void Start()
	{
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_0050: Expected O, but got Unknown
		itemToggle = ((Component)this).GetComponent<ItemToggle>();
		installerUI.SetActive(true);
		loadedUI.SetActive(false);
		rootCanvas.SetActive(true);
		((UnityEvent)startButton.onClick).AddListener((UnityAction)delegate
		{
			((MonoBehaviour)this).StartCoroutine(InstallSequence());
		});
	}

	private void Update()
	{
		if ((Object)(object)itemToggle != (Object)null && itemToggle.toggleImpulse && !recentlyPressed)
		{
			((MonoBehaviour)this).StartCoroutine(PressCooldown());
			Debug.Log((object)"[Installer] Grab press detected - starting installer.");
			((UnityEvent)startButton.onClick).Invoke();
		}
	}

	[IteratorStateMachine(typeof(<PressCooldown>d__13))]
	private IEnumerator PressCooldown()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <PressCooldown>d__13(0)
		{
			<>4__this = this
		};
	}

	[IteratorStateMachine(typeof(<InstallSequence>d__14))]
	private IEnumerator InstallSequence()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <InstallSequence>d__14(0)
		{
			<>4__this = this
		};
	}
}
public class NetworkedProximityTrigger : MonoBehaviourPun
{
	[Header("Trigger Settings")]
	public float triggerDistance = 2f;

	public float deactivateAfterSeconds = 49f;

	public bool retriggerable = false;

	[Header("Actions")]
	public VideoPlayer videoPlayer;

	public AudioSource externalAudioSource;

	[Header("Audio Control")]
	public bool startAudioOnActivate = false;

	public bool stopAudioOnDeactivate = false;

	public GameObject[] objectsToToggle;

	[Header("Animator Settings")]
	public Animator targetAnimator;

	public string triggerParameterName = "Activate";

	private bool isActive = false;

	private bool hasTriggered = false;

	private float timer = 0f;

	private PlayerAvatar playerTarget;

	private void FixedUpdate()
	{
		//IL_004c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		if (hasTriggered)
		{
			return;
		}
		if ((Object)(object)playerTarget == (Object)null)
		{
			foreach (PlayerAvatar item in SemiFunc.PlayerGetList())
			{
				if (item.isDisabled || !(Vector3.Distance(((Component)this).transform.position, ((Component)item).transform.position) <= triggerDistance))
				{
					continue;
				}
				playerTarget = item;
				break;
			}
		}
		if (!((Object)(object)playerTarget != (Object)null) || playerTarget.isDisabled)
		{
			return;
		}
		if (!isActive)
		{
			TriggerActivate();
			return;
		}
		timer += Time.fixedDeltaTime;
		if (timer >= deactivateAfterSeconds)
		{
			TriggerDeactivate();
			hasTriggered = true;
		}
	}

	private void TriggerActivate()
	{
		if (PhotonNetwork.IsConnectedAndReady || PhotonNetwork.OfflineMode)
		{
			((MonoBehaviourPun)this).photonView.RPC("ActivateTrigger", (RpcTarget)3, Array.Empty<object>());
		}
		else
		{
			ActivateTrigger();
		}
	}

	private void TriggerDeactivate()
	{
		if (PhotonNetwork.IsConnectedAndReady || PhotonNetwork.OfflineMode)
		{
			((MonoBehaviourPun)this).photonView.RPC("DeactivateTrigger", (RpcTarget)3, Array.Empty<object>());
		}
		else
		{
			DeactivateTrigger();
		}
	}

	[PunRPC]
	private void ActivateTrigger()
	{
		if (isActive)
		{
			return;
		}
		isActive = true;
		timer = 0f;
		if ((Object)(object)videoPlayer != (Object)null)
		{
			videoPlayer.Play();
		}
		if (startAudioOnActivate && (Object)(object)externalAudioSource != (Object)null && !externalAudioSource.isPlaying)
		{
			externalAudioSource.Play();
		}
		GameObject[] array = objectsToToggle;
		foreach (GameObject val in array)
		{
			if ((Object)(object)val != (Object)null)
			{
				val.SetActive(true);
			}
		}
		if ((Object)(object)targetAnimator != (Object)null && !string.IsNullOrEmpty(triggerParameterName))
		{
			targetAnimator.SetTrigger(triggerParameterName);
		}
	}

	[PunRPC]
	private void DeactivateTrigger()
	{
		if (!isActive)
		{
			return;
		}
		isActive = false;
		playerTarget = null;
		if ((Object)(object)videoPlayer != (Object)null)
		{
			videoPlayer.Stop();
		}
		if (stopAudioOnDeactivate && (Object)(object)externalAudioSource != (Object)null)
		{
			externalAudioSource.Stop();
		}
		GameObject[] array = objectsToToggle;
		foreach (GameObject val in array)
		{
			if ((Object)(object)val != (Object)null)
			{
				val.SetActive(false);
			}
		}
	}
}
public class PlayerWallBlocker : Trap
{
	[Header("Push Settings")]
	public float blockRange = 2f;

	public float pushForce = 30f;

	public override void Update()
	{
		((Trap)this).Update();
		if (SemiFunc.IsMasterClientOrSingleplayer())
		{
			PushBackNearbyPlayers();
		}
	}

	private void PushBackNearbyPlayers()
	{
		//IL_0030: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_005f: Unknown result type (might be due to invalid IL or missing references)
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_006f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0074: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_009a: 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_00ac: Unknown result type (might be due to invalid IL or missing references)
		foreach (PlayerAvatar item in SemiFunc.PlayerGetList())
		{
			if (!item.isDisabled)
			{
				float num = Vector3.Distance(((Component)this).transform.position, ((Component)item).transform.position);
				if (num <= blockRange)
				{
					Vector3 val = ((Component)item).transform.position - ((Component)this).transform.position;
					Vector3 normalized = ((Vector3)(ref val)).normalized;
					normalized.y = 0f;
					Rigidbody rb = item.tumble.rb;
					rb.AddForce(normalized * pushForce * Time.deltaTime, (ForceMode)2);
				}
			}
		}
	}
}
public class PlinkoGameManager : MonoBehaviourPun
{
	[CompilerGenerated]
	private sealed class <DropTimeoutCheck>d__21 : IEnumerator<object>, IEnumerator, IDisposable
	{
		private int <>1__state;

		private object <>2__current;

		public PlinkoGameManager <>4__this;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <DropTimeoutCheck>d__21(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<>2__current = (object)new WaitForSeconds(<>4__this.maxDropTime);
				<>1__state = 1;
				return true;
			case 1:
				<>1__state = -1;
				if (<>4__this.dropActive)
				{
					<>4__this.FinishDrop();
				}
				return false;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	[CompilerGenerated]
	private sealed class <ResetDropAfterDelay>d__26 : IEnumerator<object>, IEnumerator, IDisposable
	{
		private int <>1__state;

		private object <>2__current;

		public PlinkoGameManager <>4__this;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <ResetDropAfterDelay>d__26(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Expected O, but got Unknown
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<>4__this.isResetting = true;
				<>2__current = (object)new WaitForSeconds(<>4__this.resetDelay);
				<>1__state = 1;
				return true;
			case 1:
				<>1__state = -1;
				<>4__this.isResetting = false;
				return false;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	[Header("Ball")]
	public Rigidbody ballRb;

	public Transform dropStart;

	public float maxDropTime = 10f;

	[Header("Detection")]
	public float detectionRadius = 0.5f;

	public float resetDelay = 3f;

	[Header("Zones")]
	public List<Transform> rewardZones = new List<Transform>();

	public List<Transform> deathZones = new List<Transform>();

	[Header("Reward System")]
	public GameObject rewardPrefab;

	public Transform rewardSpawnPoint;

	public AudioSource rewardAudioSource;

	public AudioClip rewardClip;

	[Header("Death")]
	public HurtCollider playerKillCollider;

	private PlinkoGrabTracker grabTracker;

	private bool dropActive = false;

	private bool isResetting = false;

	private Coroutine dropTimeoutRoutine;

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

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

	private void Start()
	{
		if (!PhotonNetwork.IsConnected)
		{
			PhotonNetwork.OfflineMode = true;
		}
		if ((Object)(object)ballRb == (Object)null)
		{
			Debug.LogError((object)"❌ Ball Rigidbody not assigned!");
		}
		else
		{
			Debug.Log((object)("✅ Ball Rigidbody assigned: " + ((Object)ballRb).name));
		}
		grabTracker = ((Component)ballRb).GetComponent<PlinkoGrabTracker>();
		Debug.Log((object)$"\ud83c\udfaf Reward zones: {rewardZones.Count}");
		Debug.Log((object)$"☠\ufe0f Death zones: {deathZones.Count}");
		Debug.Log((object)"✅ Plinko setup complete.");
	}

	private void Update()
	{
		if ((Object)(object)ballRb == (Object)null)
		{
			((Behaviour)this).enabled = false;
		}
		else if ((PhotonNetwork.IsMasterClient || PhotonNetwork.OfflineMode) && !isResetting)
		{
			CheckBallDropStartY();
			if (dropActive)
			{
				CheckDeathZones();
			}
		}
	}

	private void CheckBallDropStartY()
	{
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_002d: Unknown result type (might be due to invalid IL or missing references)
		if (!dropActive && (Object)(object)dropStart != (Object)null && ballRb.position.y <= dropStart.position.y)
		{
			dropActive = true;
		}
	}

	[IteratorStateMachine(typeof(<DropTimeoutCheck>d__21))]
	private IEnumerator DropTimeoutCheck()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <DropTimeoutCheck>d__21(0)
		{
			<>4__this = this
		};
	}

	private void CheckDeathZones()
	{
		//IL_003d: 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)
		for (int i = 0; i < deathZones.Count; i++)
		{
			Transform val = deathZones[i];
			if ((Object)(object)val == (Object)null || usedDeathZones.Contains(val))
			{
				continue;
			}
			float num = Vector3.Distance(ballRb.position, val.position);
			if (num <= detectionRadius)
			{
				usedDeathZones.Add(val);
				Debug.Log((object)("☠\ufe0f Death zone hit: " + ((Object)val).name));
				FinishDrop();
				if (PhotonNetwork.OfflineMode)
				{
					RemoteKillRPC();
				}
				else
				{
					((MonoBehaviourPun)this).photonView.RPC("RemoteKillRPC", (RpcTarget)0, Array.Empty<object>());
				}
				break;
			}
		}
	}

	public void OnRewardZoneTrigger(Transform zone)
	{
		if (dropActive && !isResetting && !usedRewardZones.Contains(zone))
		{
			usedRewardZones.Add(zone);
			Debug.Log((object)("\ud83c\udf81 Reward zone triggered: " + ((Object)zone).name));
			SpawnReward();
			FinishDrop();
		}
	}

	private void SpawnReward()
	{
		//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_0055: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: 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)
		if (!((Object)(object)rewardPrefab == (Object)null) && !((Object)(object)rewardSpawnPoint == (Object)null))
		{
			Vector3 position = rewardSpawnPoint.position;
			if (PhotonNetwork.OfflineMode)
			{
				Object.Instantiate<GameObject>(rewardPrefab, position, Quaternion.identity);
			}
			else
			{
				PhotonNetwork.Instantiate("RewardThing", position, Quaternion.identity, (byte)0, (object[])null);
			}
			if (Object.op_Implicit((Object)(object)rewardAudioSource) && Object.op_Implicit((Object)(object)rewardClip))
			{
				rewardAudioSource.PlayOneShot(rewardClip);
			}
		}
	}

	private void FinishDrop()
	{
		dropActive = false;
		if (dropTimeoutRoutine != null)
		{
			((MonoBehaviour)this).StopCoroutine(dropTimeoutRoutine);
			dropTimeoutRoutine = null;
		}
		((MonoBehaviour)this).StartCoroutine(ResetDropAfterDelay());
	}

	[IteratorStateMachine(typeof(<ResetDropAfterDelay>d__26))]
	private IEnumerator ResetDropAfterDelay()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <ResetDropAfterDelay>d__26(0)
		{
			<>4__this = this
		};
	}

	[PunRPC]
	private void RemoteKillRPC()
	{
		if ((Object)(object)grabTracker?.lastGrabber?.playerHealth != (Object)null)
		{
			Debug.Log((object)("☠\ufe0f Killing player: " + ((Object)grabTracker.lastGrabber).name));
			grabTracker.lastGrabber.playerHealth.Hurt(grabTracker.lastGrabber.playerHealth.health, false, -1);
		}
	}
}
public class PlinkoGrabTracker : MonoBehaviour
{
	[Header("Grab Tracking")]
	public PlayerAvatar lastGrabber;

	public PlinkoGameManager gameManager;

	private PhysGrabObject physGrab;

	private void Awake()
	{
		physGrab = ((Component)this).GetComponent<PhysGrabObject>();
		if ((Object)(object)gameManager == (Object)null)
		{
			gameManager = Object.FindObjectOfType<PlinkoGameManager>();
		}
	}

	private void Update()
	{
		if ((Object)(object)physGrab != (Object)null && physGrab.playerGrabbing != null && physGrab.playerGrabbing.Count > 0)
		{
			PhysGrabber val = physGrab.playerGrabbing[physGrab.playerGrabbing.Count - 1];
			if ((Object)(object)val != (Object)null && (Object)(object)val.playerAvatar != (Object)null)
			{
				lastGrabber = val.playerAvatar;
			}
		}
	}

	private void OnTriggerEnter(Collider other)
	{
		if (((Component)other).CompareTag("RewardZone"))
		{
			gameManager.OnRewardZoneTrigger(((Component)other).transform);
		}
	}
}
public class RewardZone : MonoBehaviour
{
}
public class TeleportGlitchValuable : Trap
{
	[Header("Teleport Settings")]
	public float teleportForce = 150f;

	public float teleportInterval = 2f;

	private float teleportTimer = 0f;

	public override void Update()
	{
		((Trap)this).Update();
		if (SemiFunc.IsMasterClientOrSingleplayer())
		{
			CheckForGrabTeleport();
		}
	}

	private void CheckForGrabTeleport()
	{
		if (base.physGrabObject.grabbed)
		{
			teleportTimer += Time.deltaTime;
			if (!(teleportTimer >= teleportInterval))
			{
				return;
			}
			teleportTimer = 0f;
			{
				foreach (PhysGrabber item in base.physGrabObject.playerGrabbing)
				{
					if ((Object)(object)item != (Object)null && (Object)(object)item.playerAvatar != (Object)null)
					{
						ApplyTeleportEffect(item.playerAvatar);
					}
				}
				return;
			}
		}
		teleportTimer = 0f;
	}

	private void ApplyTeleportEffect(PlayerAvatar player)
	{
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: 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_0022: Unknown result type (might be due to invalid IL or missing references)
		player.tumble.TumbleRequest(true, false);
		Vector3 up = Vector3.up;
		player.tumble.TumbleForce(up * teleportForce);
		player.tumble.TumbleOverrideTime(1.5f);
	}
}
namespace NWH.DWP2.DefaultWater
{
	[ExecuteInEditMode]
	[RequireComponent(typeof(WaterBase))]
	public class Displace : MonoBehaviour
	{
		public void Awake()
		{
			if (((Behaviour)this).enabled)
			{
				OnEnable();
			}
			else
			{
				OnDisable();
			}
		}

		public void OnEnable()
		{
			Shader.EnableKeyword("WATER_VERTEX_DISPLACEMENT_ON");
			Shader.DisableKeyword("WATER_VERTEX_DISPLACEMENT_OFF");
		}

		public void OnDisable()
		{
			Shader.EnableKeyword("WATER_VERTEX_DISPLACEMENT_OFF");
			Shader.DisableKeyword("WATER_VERTEX_DISPLACEMENT_ON");
		}
	}
	[ExecuteInEditMode]
	[RequireComponent(typeof(WaterBase))]
	public class GerstnerDisplace : Displace
	{
	}
	public class MeshContainer
	{
		public Mesh mesh;

		public Vector3[] vertices;

		public Vector3[] normals;

		public MeshContainer(Mesh m)
		{
			mesh = m;
			vertices = m.vertices;
			normals = m.normals;
		}

		public void Update()
		{
			mesh.vertices = vertices;
			mesh.normals = normals;
		}
	}
	[ExecuteInEditMode]
	[RequireComponent(typeof(WaterBase))]
	public class PlanarReflection : MonoBehaviour
	{
		public LayerMask reflectionMask;

		public bool reflectSkybox;

		public Color clearColor = Color.grey;

		public string reflectionSampler = "_ReflectionTex";

		public float clipPlaneOffset = 0.07f;

		private Vector3 m_Oldpos;

		private Camera m_ReflectionCamera;

		private Material m_SharedMaterial;

		private Dictionary<Camera, bool> m_HelperCameras;

		public void Start()
		{
			m_SharedMaterial = ((WaterBase)(object)((Component)this).gameObject.GetComponent(typeof(WaterBase))).sharedMaterial;
		}

		public void LateUpdate()
		{
			if (m_HelperCameras != null)
			{
				m_HelperCameras.Clear();
			}
		}

		private Camera CreateReflectionCameraFor(Camera cam)
		{
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Expected O, but got Unknown
			//IL_0087: 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)
			string text = ((Object)((Component)this).gameObject).name + "Reflection" + ((Object)cam).name;
			GameObject val = GameObject.Find(text);
			if (!Object.op_Implicit((Object)(object)val))
			{
				val = new GameObject(text, new Type[1] { typeof(Camera) });
			}
			if (!Object.op_Implicit((Object)(object)val.GetComponent(typeof(Camera))))
			{
				val.AddComponent(typeof(Camera));
			}
			Camera component = val.GetComponent<Camera>();
			component.backgroundColor = clearColor;
			component.clearFlags = (CameraClearFlags)(reflectSkybox ? 1 : 2);
			SetStandardCameraParameter(component, reflectionMask);
			if (!Object.op_Implicit((Object)(object)component.targetTexture))
			{
				component.targetTexture = CreateTextureFor(cam);
			}
			return component;
		}

		private void SetStandardCameraParameter(Camera cam, LayerMask mask)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			cam.cullingMask = LayerMask.op_Implicit(mask) & ~(1 << LayerMask.NameToLayer("Water"));
			cam.backgroundColor = Color.black;
			((Behaviour)cam).enabled = false;
		}

		private RenderTexture CreateTextureFor(Camera cam)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			RenderTexture val = new RenderTexture(Mathf.FloorToInt((float)cam.pixelWidth * 0.5f), Mathf.FloorToInt((float)cam.pixelHeight * 0.5f), 24);
			((Object)val).hideFlags = (HideFlags)52;
			return val;
		}

		public void RenderHelpCameras(Camera currentCam)
		{
			if (m_HelperCameras == null)
			{
				m_HelperCameras = new Dictionary<Camera, bool>();
			}
			if (!m_HelperCameras.ContainsKey(currentCam))
			{
				m_HelperCameras.Add(currentCam, value: false);
			}
			if (!m_HelperCameras[currentCam])
			{
				if (!Object.op_Implicit((Object)(object)m_ReflectionCamera))
				{
					m_ReflectionCamera = CreateReflectionCameraFor(currentCam);
				}
				RenderReflectionFor(currentCam, m_ReflectionCamera);
				m_HelperCameras[currentCam] = true;
			}
		}

		public void WaterTileBeingRendered(Transform tr, Camera currentCam)
		{
			RenderHelpCameras(currentCam);
			if (Object.op_Implicit((Object)(object)m_ReflectionCamera) && Object.op_Implicit((Object)(object)m_SharedMaterial))
			{
				m_SharedMaterial.SetTexture(reflectionSampler, (Texture)(object)m_ReflectionCamera.targetTexture);
			}
		}

		public void OnEnable()
		{
			Shader.EnableKeyword("WATER_REFLECTIVE");
			Shader.DisableKeyword("WATER_SIMPLE");
		}

		public void OnDisable()
		{
			Shader.EnableKeyword("WATER_SIMPLE");
			Shader.DisableKeyword("WATER_REFLECTIVE");
		}

		private void RenderReflectionFor(Camera cam, Camera reflectCamera)
		{
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0163: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_0194: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_01af: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0201: Unknown result type (might be due to invalid IL or missing references)
			//IL_0206: Unknown result type (might be due to invalid IL or missing references)
			//IL_020b: Unknown result type (might be due to invalid IL or missing references)
			//IL_020f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0214: Unknown result type (might be due to invalid IL or missing references)
			//IL_0216: Unknown result type (might be due to invalid IL or missing references)
			//IL_0223: Unknown result type (might be due to invalid IL or missing references)
			//IL_0224: Unknown result type (might be due to invalid IL or missing references)
			//IL_022a: Unknown result type (might be due to invalid IL or missing references)
			//IL_022f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0232: Unknown result type (might be due to invalid IL or missing references)
			//IL_0237: Unknown result type (might be due to invalid IL or missing references)
			//IL_0239: Unknown result type (might be due to invalid IL or missing references)
			//IL_023b: 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_0245: Unknown result type (might be due to invalid IL or missing references)
			//IL_0253: Unknown result type (might be due to invalid IL or missing references)
			//IL_0261: Unknown result type (might be due to invalid IL or missing references)
			//IL_0266: Unknown result type (might be due to invalid IL or missing references)
			//IL_026e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0276: Unknown result type (might be due to invalid IL or missing references)
			//IL_027d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0284: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Expected O, but got Unknown
			//IL_011e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_010b: Expected O, but got Unknown
			if (!Object.op_Implicit((Object)(object)reflectCamera) || (Object.op_Implicit((Object)(object)m_SharedMaterial) && !m_SharedMaterial.HasProperty(reflectionSampler)))
			{
				return;
			}
			reflectCamera.cullingMask = LayerMask.op_Implicit(reflectionMask) & ~(1 << LayerMask.NameToLayer("Water"));
			SaneCameraSettings(reflectCamera);
			reflectCamera.backgroundColor = clearColor;
			reflectCamera.clearFlags = (CameraClearFlags)(reflectSkybox ? 1 : 2);
			if (reflectSkybox && Object.op_Implicit((Object)(object)((Component)cam).gameObject.GetComponent(typeof(Skybox))))
			{
				Skybox val = (Skybox)((Component)reflectCamera).gameObject.GetComponent(typeof(Skybox));
				if (!Object.op_Implicit((Object)(object)val))
				{
					val = (Skybox)((Component)reflectCamera).gameObject.AddComponent(typeof(Skybox));
				}
				val.material = ((Skybox)((Component)cam).GetComponent(typeof(Skybox))).material;
			}
			GL.invertCulling = true;
			Transform transform = ((Component)this).transform;
			Vector3 eulerAngles = ((Component)cam).transform.eulerAngles;
			((Component)reflectCamera).transform.eulerAngles = new Vector3(0f - eulerAngles.x, eulerAngles.y, eulerAngles.z);
			((Component)reflectCamera).transform.position = ((Component)cam).transform.position;
			Vector3 position = ((Component)transform).transform.position;
			position.y = transform.position.y;
			Vector3 up = ((Component)transform).transform.up;
			float num = 0f - Vector3.Dot(up, position) - clipPlaneOffset;
			Vector4 plane = default(Vector4);
			((Vector4)(ref plane))..ctor(up.x, up.y, up.z, num);
			Matrix4x4 val2 = Matrix4x4.zero;
			val2 = CalculateReflectionMatrix(val2, plane);
			m_Oldpos = ((Component)cam).transform.position;
			Vector3 position2 = ((Matrix4x4)(ref val2)).MultiplyPoint(m_Oldpos);
			reflectCamera.worldToCameraMatrix = cam.worldToCameraMatrix * val2;
			Vector4 clipPlane = CameraSpacePlane(reflectCamera, position, up, 1f);
			Matrix4x4 projectionMatrix = cam.projectionMatrix;
			projectionMatrix = CalculateObliqueMatrix(projectionMatrix, clipPlane);
			reflectCamera.projectionMatrix = projectionMatrix;
			((Component)reflectCamera).transform.position = position2;
			Vector3 eulerAngles2 = ((Component)cam).transform.eulerAngles;
			((Component)reflectCamera).transform.eulerAngles = new Vector3(0f - eulerAngles2.x, eulerAngles2.y, eulerAngles2.z);
			reflectCamera.Render();
			GL.invertCulling = false;
		}

		private void SaneCameraSettings(Camera helperCam)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			helperCam.depthTextureMode = (DepthTextureMode)0;
			helperCam.backgroundColor = Color.black;
			helperCam.clearFlags = (CameraClearFlags)2;
			helperCam.renderingPath = (RenderingPath)1;
		}

		private static Matrix4x4 CalculateObliqueMatrix(Matrix4x4 projection, Vector4 clipPlane)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: 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_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: 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)
			Vector4 val = ((Matrix4x4)(ref projection)).inverse * new Vector4(Sgn(clipPlane.x), Sgn(clipPlane.y), 1f, 1f);
			Vector4 val2 = clipPlane * (2f / Vector4.Dot(clipPlane, val));
			((Matrix4x4)(ref projection))[2] = val2.x - ((Matrix4x4)(ref projection))[3];
			((Matrix4x4)(ref projection))[6] = val2.y - ((Matrix4x4)(ref projection))[7];
			((Matrix4x4)(ref projection))[10] = val2.z - ((Matrix4x4)(ref projection))[11];
			((Matrix4x4)(ref projection))[14] = val2.w - ((Matrix4x4)(ref projection))[15];
			return projection;
		}

		private static Matrix4x4 CalculateReflectionMatrix(Matrix4x4 reflectionMat, Vector4 plane)
		{
			//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_01af: Unknown result type (might be due to invalid IL or missing references)
			reflectionMat.m00 = 1f - 2f * ((

plugins/REPO-DeadTTS.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Photon.Pun;
using REPO_DeadTTS.Config;
using TMPro;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("REPO-DeadTTS")]
[assembly: AssemblyDescription("Mod created by flipf17")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("REPO-DeadTTS")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("8e05cd18-c8aa-419a-b430-33faaf371490")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace REPO_DeadTTS
{
	[BepInPlugin("flipf17.DeadTTS", "DeadTTS", "1.0.14")]
	public class Plugin : BaseUnityPlugin
	{
		private Harmony _harmony;

		public static Plugin instance;

		private static ManualLogSource logger;

		private void Awake()
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			instance = this;
			CreateCustomLogger();
			ConfigSettings.BindConfigSettings();
			_harmony = new Harmony("DeadTTS");
			PatchAll();
			Log("DeadTTS loaded");
		}

		private void PatchAll()
		{
			IEnumerable<Type> enumerable;
			try
			{
				enumerable = Assembly.GetExecutingAssembly().GetTypes();
			}
			catch (ReflectionTypeLoadException ex)
			{
				enumerable = ex.Types.Where((Type t) => t != null);
			}
			foreach (Type item in enumerable)
			{
				_harmony.PatchAll(item);
			}
		}

		private void CreateCustomLogger()
		{
			try
			{
				logger = Logger.CreateLogSource(string.Format("{0}-{1}", "DeadTTS", "1.0.14"));
			}
			catch
			{
				logger = ((BaseUnityPlugin)this).Logger;
			}
		}

		internal static void Log(string message)
		{
			logger.LogInfo((object)message);
		}

		internal static void LogError(string message)
		{
			logger.LogError((object)message);
		}

		internal static void LogWarning(string message)
		{
			logger.LogWarning((object)message);
		}

		internal static void LogVerbose(string message)
		{
			if (ConfigSettings.verboseLogs.Value)
			{
				logger.LogInfo((object)("[VERBOSE] " + message));
			}
		}

		internal static void LogErrorVerbose(string message)
		{
			if (ConfigSettings.verboseLogs.Value)
			{
				logger.LogError((object)("[VERBOSE] " + message));
			}
		}

		internal static void LogWarningVerbose(string message)
		{
			if (ConfigSettings.verboseLogs.Value)
			{
				logger.LogWarning((object)("[VERBOSE] " + message));
			}
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "flipf17.DeadTTS";

		public const string PLUGIN_NAME = "DeadTTS";

		public const string PLUGIN_VERSION = "1.0.14";
	}
}
namespace REPO_DeadTTS.Patches
{
	[HarmonyPatch]
	public class DeadTTSPlayerData : MonoBehaviour
	{
		internal static PlayerAvatar localPlayer;

		internal static FieldInfo playerNameField = typeof(PlayerAvatar).GetField("playerName", BindingFlags.Instance | BindingFlags.NonPublic);

		internal static FieldInfo steamIdField = typeof(PlayerAvatar).GetField("steamId", BindingFlags.Instance | BindingFlags.NonPublic);

		internal static MethodInfo setupClient = typeof(PlayerDeathHead).GetMethod("SetupClient", BindingFlags.Instance | BindingFlags.NonPublic);

		public bool isLocalPlayer = false;

		public PlayerAvatar playerAvatar;

		private string _playerName;

		private string _steamId;

		public PlayerDeathHead playerDeathHead;

		public PhotonView photonView => Object.op_Implicit((Object)(object)playerAvatar) ? playerAvatar.photonView : null;

		public string playerName
		{
			get
			{
				if (string.IsNullOrEmpty(_playerName))
				{
					_playerName = (string)playerNameField.GetValue(playerAvatar);
				}
				return _playerName;
			}
			internal set
			{
				_playerName = value;
			}
		}

		public string steamId
		{
			get
			{
				if (string.IsNullOrEmpty(_steamId))
				{
					_steamId = (string)steamIdField.GetValue(playerAvatar);
				}
				return _steamId;
			}
			internal set
			{
				_steamId = value;
			}
		}

		private void Awake()
		{
			playerAvatar = ((Component)this).GetComponent<PlayerAvatar>();
			isLocalPlayer = Object.op_Implicit((Object)(object)playerAvatar) && (Object)(object)playerAvatar == (Object)(object)PlayerPatcher.localPlayer;
		}

		[HarmonyPatch(typeof(PlayerAvatar), "AddToStatsManagerRPC")]
		[HarmonyPostfix]
		public static void OnAddToStatsManagerRPC(string _playerName, string _steamID, PlayerAvatar __instance)
		{
			DeadTTSPlayerData component = ((Component)__instance).GetComponent<DeadTTSPlayerData>();
			if (Object.op_Implicit((Object)(object)component))
			{
				component.playerName = _playerName;
				component.steamId = _steamID;
			}
		}

		[HarmonyPatch(typeof(PlayerDeathHead), "SetupDone")]
		[HarmonyPostfix]
		public static void OnDeathHeadSetupDone(PlayerDeathHead __instance)
		{
			if (GameManager.Multiplayer() && !PhotonNetwork.IsMasterClient)
			{
				return;
			}
			PlayerAvatar val = __instance.playerAvatar;
			DeadTTSPlayerData deadTTSPlayerData = ((val != null) ? ((Component)val).GetComponent<DeadTTSPlayerData>() : null);
			if (Object.op_Implicit((Object)(object)deadTTSPlayerData))
			{
				if (ConfigSettings.fixMissingDeathHeads.Value)
				{
					deadTTSPlayerData.ReassignPlayerDeathHead(__instance);
				}
				if (GameManager.Multiplayer())
				{
					PhotonView component = ((Component)deadTTSPlayerData.playerDeathHead).GetComponent<PhotonView>();
					deadTTSPlayerData.photonView.RPC("ReassignPlayerDeathHeadRPC", (RpcTarget)4, new object[1] { component.ViewID });
					Plugin.Log($"Sending PlayerDeathHead assignment assurance to clients for player: {deadTTSPlayerData.playerName} ({val.photonView.Owner.ActorNumber}) ...");
				}
				else
				{
					Plugin.LogError("[OnDeathHeadSetupDone] Could not find PlayerAvatar assigned to PlayerDeathHead.");
				}
			}
		}

		[PunRPC]
		public void ReassignPlayerDeathHeadRPC(int deathHeadViewId, PhotonMessageInfo _info = default(PhotonMessageInfo))
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			if (!SemiFunc.MasterOnlyRPC(_info) || !ConfigSettings.fixMissingDeathHeads.Value)
			{
				return;
			}
			PlayerDeathHead[] array = Object.FindObjectsOfType<PlayerDeathHead>();
			PlayerDeathHead[] array2 = array;
			foreach (PlayerDeathHead val in array2)
			{
				PhotonView component = ((Component)val).GetComponent<PhotonView>();
				if (Object.op_Implicit((Object)(object)component) && component.ViewID == deathHeadViewId)
				{
					ReassignPlayerDeathHead(val);
					((MonoBehaviour)this).StartCoroutine((IEnumerator)setupClient.Invoke(playerDeathHead, null));
					return;
				}
			}
			Plugin.LogError(string.Format("Unknown error while trying to reassign PlayerDeathHead component to player: {0} ({1}) with death head view id: ", (!string.IsNullOrEmpty(playerName)) ? playerName : (Object.op_Implicit((Object)(object)playerAvatar) ? ((Object)playerAvatar).name : ""), photonView.Owner.ActorNumber) + deathHeadViewId);
		}

		[HarmonyPatch(typeof(PlayerAvatar), "PlayerDeathDone")]
		[HarmonyPrefix]
		public static void ReassignPlayerDeathHeadBackup(PlayerAvatar __instance)
		{
			if (ConfigSettings.fixMissingDeathHeads.Value)
			{
				DeadTTSPlayerData component = ((Component)__instance).GetComponent<DeadTTSPlayerData>();
				if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.playerDeathHead))
				{
					component.ReassignPlayerDeathHead(component.playerDeathHead);
				}
			}
		}

		internal void ReassignPlayerDeathHead(PlayerDeathHead deathHead)
		{
			playerDeathHead = deathHead;
			int viewID = ((Component)playerDeathHead).GetComponent<PhotonView>().ViewID;
			if ((Object)(object)playerAvatar.playerDeathHead != (Object)(object)playerDeathHead || (Object)(object)playerDeathHead.playerAvatar != (Object)(object)playerAvatar || (Object)(object)((Component)playerDeathHead).transform.parent != (Object)(object)((Component)playerAvatar).transform.parent)
			{
				playerAvatar.playerDeathHead = playerDeathHead;
				playerDeathHead.playerAvatar = playerAvatar;
				((Component)playerDeathHead).transform.SetParent(((Component)playerAvatar).transform.parent);
				Plugin.Log(string.Format("Reassigned PlayerDeathHead for player: {0} ({1}) - Assigned death head view id: ", (!string.IsNullOrEmpty(playerName)) ? playerName : (Object.op_Implicit((Object)(object)playerAvatar) ? ((Object)playerAvatar).name : ""), photonView.Owner.ActorNumber) + viewID);
			}
			if (!GameManager.Multiplayer() || !Object.op_Implicit((Object)(object)playerAvatar))
			{
				return;
			}
			try
			{
				string text = (string)steamIdField.GetValue(playerAvatar);
				PlayerAvatar val = SessionManager.instance.CrownedPlayerGet();
				string text2 = (Object.op_Implicit((Object)(object)val) ? ((string)steamIdField.GetValue(val)) : "");
				if (SemiFunc.IsMultiplayer() && ((Object)(object)playerAvatar == (Object)(object)val || (!string.IsNullOrEmpty(text) && text == text2)))
				{
					playerDeathHead.arenaCrown.SetActive(true);
				}
			}
			catch
			{
			}
		}
	}
	[HarmonyPatch]
	public static class UIPatcher
	{
		private static HashSet<WorldSpaceUITTS> deadTTSElements = new HashSet<WorldSpaceUITTS>();

		private static HashSet<WorldSpaceUITTS> deadTTSElementsFollowLog = new HashSet<WorldSpaceUITTS>();

		private static Dictionary<PlayerAvatar, bool> isDisabledStates = new Dictionary<PlayerAvatar, bool>();

		private static FieldInfo textField = typeof(WorldSpaceUITTS).GetField("text", BindingFlags.Instance | BindingFlags.NonPublic);

		private static FieldInfo playerAvatarField = typeof(WorldSpaceUITTS).GetField("playerAvatar", BindingFlags.Instance | BindingFlags.NonPublic);

		private static FieldInfo followTransformField = typeof(WorldSpaceUITTS).GetField("followTransform", BindingFlags.Instance | BindingFlags.NonPublic);

		private static FieldInfo worldPositionField = typeof(WorldSpaceUITTS).GetField("worldPosition", BindingFlags.Instance | BindingFlags.NonPublic);

		private static FieldInfo followPositionField = typeof(WorldSpaceUITTS).GetField("followPosition", BindingFlags.Instance | BindingFlags.NonPublic);

		private static FieldInfo wordTimeField = typeof(WorldSpaceUITTS).GetField("wordTime", BindingFlags.Instance | BindingFlags.NonPublic);

		private static FieldInfo ttsVoiceField = typeof(WorldSpaceUITTS).GetField("ttsVoice", BindingFlags.Instance | BindingFlags.NonPublic);

		[HarmonyPatch(typeof(WorldSpaceUIParent), "TTS")]
		[HarmonyPrefix]
		public static void OnTTSUI(PlayerAvatar _player, string _text, float _time, WorldSpaceUIParent __instance)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Invalid comparison between Unknown and I4
			//IL_0271: Unknown result type (might be due to invalid IL or missing references)
			//IL_028a: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bf: Expected O, but got Unknown
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_010f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0153: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: Expected O, but got Unknown
			if (!Object.op_Implicit((Object)(object)_player) || !GameManager.Multiplayer() || (int)GameDirector.instance.currentState != 2 || (!SemiFunc.RunIsLevel() && !SemiFunc.RunIsShop() && !SemiFunc.RunIsArena()) || !PlayerPatcher.IsPlayerDead(_player) || !ConfigSettings.useSpatialAudioDeadTTS.Value || !ConfigSettings.displayDeadTTSText.Value)
			{
				return;
			}
			if (!Object.op_Implicit((Object)(object)_player.playerDeathHead))
			{
				Plugin.LogErrorVerbose("Failed to re-create TTS UI component. PlayerDeathHead was not set by the game.");
				return;
			}
			if (string.IsNullOrEmpty(_text))
			{
				Plugin.LogErrorVerbose("Failed to re-create TTS UI component. Passed text value was null or empty.");
				return;
			}
			if (!ConfigSettings.onlyEnableWhenDiscovered.Value || (bool)PlayerPatcher.serverSeenField.GetValue(_player.playerDeathHead) || PlayerPatcher.IsLocalPlayerDead() || !SemiFunc.RunIsLevel())
			{
				try
				{
					WorldSpaceUITTS component = Object.Instantiate<GameObject>(__instance.TTSPrefab, ((Component)__instance).transform.position, ((Component)__instance).transform.rotation, ((Component)__instance).transform).GetComponent<WorldSpaceUITTS>();
					if (!Object.op_Implicit((Object)(object)component))
					{
						Plugin.LogError("Failed to create Dead TTS WorldSpaceUITTS component. Invalid prefab?");
						return;
					}
					TextMeshProUGUI val = (TextMeshProUGUI)textField.GetValue(component);
					((TMP_Text)val).text = _text;
					if (!PlayerPatcher.IsLocalPlayerDead())
					{
						string text = ((TMP_Text)val).text;
						string text2 = ConfigSettings.deadTTSColor.Value.Trim(new char[1] { ' ' }).TrimStart(new char[1] { '#' });
						if (text2.Length == 6)
						{
							((TMP_Text)val).richText = true;
							try
							{
								text = "<color=#" + text2 + ">" + ((TMP_Text)val).text + "</color>";
								((TMP_Text)val).text = text;
							}
							catch (Exception ex)
							{
								Plugin.LogError("Failed to apply dead TTS color: " + ConfigSettings.deadTTSColor.Value + "\n" + ex);
							}
						}
					}
					playerAvatarField.SetValue(component, _player);
					Transform transform = ((Component)_player.playerDeathHead).transform;
					followTransformField.SetValue(component, transform);
					worldPositionField.SetValue(component, transform.position);
					followPositionField.SetValue(component, transform.position);
					wordTimeField.SetValue(component, _time);
					PlayerVoiceChat val2 = (PlayerVoiceChat)PlayerPatcher.voiceChatField.GetValue(_player);
					if (Object.op_Implicit((Object)(object)val2))
					{
						ttsVoiceField.SetValue(component, val2.ttsVoice);
					}
					deadTTSElements.Add(component);
					try
					{
						deadTTSElements.RemoveWhere((WorldSpaceUITTS obj) => (Object)(object)obj == (Object)null);
						deadTTSElementsFollowLog.RemoveWhere((WorldSpaceUITTS obj) => (Object)(object)obj == (Object)null);
						return;
					}
					catch
					{
						return;
					}
				}
				catch (Exception ex2)
				{
					Plugin.LogError("Error initializing dead TTS UI:\n" + ex2);
					return;
				}
			}
			try
			{
				Plugin.LogWarningVerbose("Not creating TTS UI Element for dead player. ConfigEnableWhenDiscovered: " + ConfigSettings.onlyEnableWhenDiscovered.Value + " | PlayerDiscovered: " + (ConfigSettings.onlyEnableWhenDiscovered.Value ? ((bool)PlayerPatcher.serverSeenField.GetValue(_player.playerDeathHead)).ToString() : "N/A") + " | IsLocalPlayerDead: " + PlayerPatcher.IsLocalPlayerDead() + " | RunIsLevel: " + SemiFunc.RunIsLevel());
			}
			catch (Exception ex3)
			{
				Plugin.LogErrorVerbose("Error logging state for OnTTSUI: " + ex3);
			}
		}

		[HarmonyPatch(typeof(WorldSpaceUITTS), "Update")]
		[HarmonyPrefix]
		public static void UpdateUIPositionPrefix(WorldSpaceUITTS __instance)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Expected O, but got Unknown
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Expected O, but got Unknown
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Expected O, but got Unknown
			if (!deadTTSElements.Contains(__instance))
			{
				return;
			}
			try
			{
				PlayerAvatar val = (PlayerAvatar)playerAvatarField.GetValue(__instance);
				bool value = (bool)PlayerPatcher.isDisabledField.GetValue(val);
				isDisabledStates[val] = value;
				PlayerPatcher.isDisabledField.SetValue(val, false);
				if (!deadTTSElementsFollowLog.Contains(__instance))
				{
					deadTTSElementsFollowLog.Add(__instance);
					TextMeshProUGUI val2 = (TextMeshProUGUI)textField.GetValue(__instance);
					Transform val3 = (Transform)followTransformField.GetValue(__instance);
					TTSVoice val4 = (TTSVoice)ttsVoiceField.GetValue(__instance);
					bool flag = Object.op_Implicit((Object)(object)val4) && (bool)PlayerPatcher.isSpeakingField.GetValue(val4);
					if (!Object.op_Implicit((Object)(object)val4))
					{
						Plugin.LogWarningVerbose("FollowTransform: " + (((Object)(object)val3 != (Object)null) ? ((Object)val3).name : "NONE") + " | TTSVoice.IsSpeaking: " + (((Object)(object)val4 != (Object)null) ? flag.ToString() : "TTSVoice Not Set!"));
					}
				}
			}
			catch (Exception ex)
			{
				Plugin.LogError("Error (A) updating dead TTS UI location:\n" + ex);
				deadTTSElements.Remove(__instance);
			}
		}

		[HarmonyPatch(typeof(WorldSpaceUITTS), "Update")]
		[HarmonyPostfix]
		public static void UpdateUIPositionPostfix(WorldSpaceUITTS __instance)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			if (!deadTTSElements.Contains(__instance))
			{
				return;
			}
			try
			{
				PlayerAvatar val = (PlayerAvatar)playerAvatarField.GetValue(__instance);
				if (isDisabledStates.TryGetValue(val, out var value))
				{
					PlayerPatcher.isDisabledField.SetValue(val, value);
				}
			}
			catch (Exception ex)
			{
				Plugin.LogError("Error (B) updating dead TTS UI location:\n" + ex);
				deadTTSElements.Remove(__instance);
			}
		}
	}
	[HarmonyPatch]
	public static class PlayerPatcher
	{
		internal static PlayerAvatar localPlayer;

		internal static FieldInfo voiceChatField = typeof(PlayerAvatar).GetField("voiceChat", BindingFlags.Instance | BindingFlags.NonPublic);

		internal static FieldInfo isDisabledField = typeof(PlayerAvatar).GetField("isDisabled", BindingFlags.Instance | BindingFlags.NonPublic);

		internal static FieldInfo serverSeenField = typeof(PlayerDeathHead).GetField("serverSeen", BindingFlags.Instance | BindingFlags.NonPublic);

		internal static FieldInfo eyeMaterialField = typeof(PlayerDeathHead).GetField("eyeMaterial", BindingFlags.Instance | BindingFlags.NonPublic);

		internal static FieldInfo eyeMaterialAmountField = typeof(PlayerDeathHead).GetField("eyeMaterialAmount", BindingFlags.Instance | BindingFlags.NonPublic);

		internal static FieldInfo eyeFlashLerpField = typeof(PlayerDeathHead).GetField("eyeFlashLerp", BindingFlags.Instance | BindingFlags.NonPublic);

		internal static FieldInfo isSpeakingField = typeof(TTSVoice).GetField("isSpeaking", BindingFlags.Instance | BindingFlags.NonPublic);

		internal static Dictionary<PlayerAvatar, float> deadPlayersVoicePitch = new Dictionary<PlayerAvatar, float>();

		[HarmonyPatch(typeof(PlayerAvatar), "Awake")]
		[HarmonyPostfix]
		public static void InitPlayer(ref bool ___isLocal, PlayerAvatar __instance)
		{
			if (___isLocal)
			{
				localPlayer = __instance;
			}
			((Component)__instance).gameObject.AddComponent<DeadTTSPlayerData>();
		}

		[HarmonyPatch(typeof(RoundDirector), "StartRoundLogic")]
		[HarmonyPrefix]
		public static void RandomizeTTSPitch(int value, RoundDirector __instance)
		{
			int num = value;
			deadPlayersVoicePitch.Clear();
			for (int i = 0; i < GameDirector.instance.PlayerList.Count; i++)
			{
				PlayerAvatar val = GameDirector.instance.PlayerList[i];
				DeadTTSPlayerData component = ((Component)val).GetComponent<DeadTTSPlayerData>();
				if (!Object.op_Implicit((Object)(object)val))
				{
					continue;
				}
				float num2 = 1f;
				if (GameManager.Multiplayer() && value > 0)
				{
					int num3 = -1;
					int seed = -1;
					try
					{
						num3 = val.photonView.Owner.ActorNumber;
					}
					catch (Exception ex)
					{
						Plugin.LogWarning("Failed to get player id for player: " + ((Object.op_Implicit((Object)(object)component) && !string.IsNullOrEmpty(component.playerName)) ? component.playerName : ((Object)val).name) + " when calculating random seed. Don't worry about this.");
						Plugin.LogWarningVerbose("Error: " + ex);
					}
					if (num3 != -1)
					{
						seed = num + num3;
						Random random = new Random(seed);
						float value2 = ConfigSettings.minRandomPitch.Value;
						float value3 = ConfigSettings.maxRandomPitch.Value;
						num2 = (float)(random.NextDouble() * (double)(value3 - value2) + (double)value2);
					}
					if (deadPlayersVoicePitch.TryGetValue(val, out var value4) && num2 != value4)
					{
						Plugin.Log("Setting dead TTS pitch for player with id: " + num3 + " to: " + num2);
					}
					Plugin.LogVerbose("DeadTTS Pitch BaseSeed: " + num + " PlayerId: " + num3 + " PlayerSeed: " + seed);
				}
				deadPlayersVoicePitch[val] = num2;
			}
		}

		[HarmonyPatch(typeof(PlayerVoiceChat), "TtsFollowVoiceSettings")]
		[HarmonyPostfix]
		public static void OnTtsFollowVoiceSettings(ref PlayerAvatar ___playerAvatar, ref AudioLowPassLogic ___lowPassLogicTTS, ref bool ___inLobbyMixerTTS, ref float ___clipLoudnessTTS, PlayerVoiceChat __instance)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Invalid comparison between Unknown and I4
			//IL_0322: Unknown result type (might be due to invalid IL or missing references)
			//IL_0329: Expected O, but got Unknown
			if (!Object.op_Implicit((Object)(object)___playerAvatar) || !GameManager.Multiplayer() || (int)GameDirector.instance.currentState != 2 || (!SemiFunc.RunIsLevel() && !SemiFunc.RunIsShop() && !SemiFunc.RunIsArena()))
			{
				return;
			}
			DeadTTSPlayerData component = ((Component)___playerAvatar).GetComponent<DeadTTSPlayerData>();
			if (!(IsPlayerDead(___playerAvatar) & ___inLobbyMixerTTS))
			{
				return;
			}
			if (!ConfigSettings.onlyEnableWhenDiscovered.Value || !Object.op_Implicit((Object)(object)___playerAvatar.playerDeathHead) || (bool)serverSeenField.GetValue(___playerAvatar.playerDeathHead) || IsLocalPlayerDead() || !SemiFunc.RunIsLevel())
			{
				if (Object.op_Implicit((Object)(object)__instance.ttsAudioSource) && Object.op_Implicit((Object)(object)__instance.mixerTTSSound))
				{
					if ((Object)(object)__instance.ttsAudioSource.outputAudioMixerGroup != (Object)(object)__instance.mixerTTSSound)
					{
						__instance.ttsAudioSource.outputAudioMixerGroup = __instance.mixerTTSSound;
						if (!Object.op_Implicit((Object)(object)___playerAvatar.playerDeathHead))
						{
							Plugin.LogError("Game did not assign player a death head.");
						}
						if (!Object.op_Implicit((Object)(object)__instance.ttsVoice))
						{
							Plugin.LogError("Game did not assign player a tts voice.");
						}
						else
						{
							Plugin.LogVerbose($"The game has toggled ON lobby chat for player: {((Object.op_Implicit((Object)(object)component) && !string.IsNullOrEmpty(component.playerName)) ? component.playerName : ((Object)___playerAvatar).name)} ({___playerAvatar.photonView.Owner.ActorNumber}). Disabling TTS lobby mixer.");
							__instance.ttsVoice.setVoice(1);
							__instance.ttsVoice.StopAndClearVoice();
						}
					}
					float pitch = (deadPlayersVoicePitch.ContainsKey(___playerAvatar) ? deadPlayersVoicePitch[___playerAvatar] : 1f);
					__instance.ttsAudioSource.pitch = pitch;
					if ((Object)(object)___playerAvatar != (Object)(object)localPlayer && (!ConfigSettings.disableWhileDead.Value || !IsLocalPlayerDead()))
					{
						__instance.ttsAudioSource.volume = ConfigSettings.deadTTSVolume.Value;
						if (ConfigSettings.useSpatialAudioDeadTTS.Value)
						{
							__instance.ttsAudioSource.spatialBlend = 1f;
						}
					}
					else
					{
						__instance.ttsAudioSource.volume = 1f;
					}
				}
				else
				{
					string text = (((Object)(object)__instance.ttsAudioSource != (Object)null) ? "Game did not assign player a ttsAudioSource. " : "");
					text += (((Object)(object)__instance.mixerTTSSound != (Object)null) ? "Game did not assign player a mixerTTSSound." : "");
					if (!string.IsNullOrEmpty(text))
					{
						Plugin.LogError(text.TrimEnd(new char[1] { ' ' }));
					}
				}
			}
			if (Object.op_Implicit((Object)(object)___playerAvatar.playerDeathHead))
			{
				bool flag = (bool)isSpeakingField.GetValue(__instance.ttsVoice);
				Material val = (Material)eyeMaterialField.GetValue(___playerAvatar.playerDeathHead);
				int num = (int)eyeMaterialAmountField.GetValue(___playerAvatar.playerDeathHead);
				if (flag)
				{
					float num2 = (float)eyeFlashLerpField.GetValue(___playerAvatar.playerDeathHead);
					float num3 = Mathf.Clamp01(Mathf.Max(___clipLoudnessTTS, 0f) / 0.2f);
					num2 = Mathf.Lerp(num2, num3, 20f * Time.deltaTime);
					val.SetFloat(num, Mathf.Pow(num2, 0.5f));
					eyeFlashLerpField.SetValue(___playerAvatar.playerDeathHead, num2);
				}
				else
				{
					val.SetFloat(num, 0f);
					eyeFlashLerpField.SetValue(___playerAvatar.playerDeathHead, 0);
				}
			}
		}

		[HarmonyPatch(typeof(PlayerVoiceChat), "ToggleLobby")]
		[HarmonyPostfix]
		public static void OnToggleOffLobbyChat(bool _toggle, ref PlayerAvatar ___playerAvatar, PlayerVoiceChat __instance)
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Invalid comparison between Unknown and I4
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Expected O, but got Unknown
			if (!GameManager.Multiplayer() || (int)GameDirector.instance.currentState != 2 || (!SemiFunc.RunIsLevel() && !SemiFunc.RunIsShop() && !SemiFunc.RunIsArena()))
			{
				return;
			}
			DeadTTSPlayerData component = ((Component)___playerAvatar).GetComponent<DeadTTSPlayerData>();
			PhotonView val = (Object.op_Implicit((Object)(object)component) ? component.photonView : ___playerAvatar.photonView);
			if (!_toggle)
			{
				Plugin.LogVerbose($"The game has toggled OFF lobby chat for player: {((Object.op_Implicit((Object)(object)component) && !string.IsNullOrEmpty(component.playerName)) ? component.playerName : ((Object)___playerAvatar).name)} ({___playerAvatar.photonView.Owner.ActorNumber})");
				if (Object.op_Implicit((Object)(object)__instance.ttsAudioSource) && Object.op_Implicit((Object)(object)__instance.mixerTTSSound))
				{
					__instance.ttsAudioSource.volume = 1f;
					__instance.ttsAudioSource.pitch = 1f;
					__instance.ttsVoice.setVoice(0);
				}
				if (Object.op_Implicit((Object)(object)___playerAvatar.playerDeathHead))
				{
					Material val2 = (Material)eyeMaterialField.GetValue(___playerAvatar.playerDeathHead);
					int num = (int)eyeMaterialAmountField.GetValue(___playerAvatar.playerDeathHead);
					val2.SetFloat(num, 0f);
				}
			}
		}

		[HarmonyPatch(typeof(PlayerVoiceChat), "LateUpdate")]
		[HarmonyPrefix]
		public static void MoveTTSAudioTransform(ref PlayerAvatar ___playerAvatar, ref bool ___inLobbyMixerTTS, PlayerVoiceChat __instance)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Invalid comparison between Unknown and I4
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)___playerAvatar) && GameManager.Multiplayer() && (int)GameDirector.instance.currentState == 2 && (SemiFunc.RunIsLevel() || SemiFunc.RunIsShop() || SemiFunc.RunIsArena()) && ___inLobbyMixerTTS && IsPlayerDead(___playerAvatar) && Object.op_Implicit((Object)(object)___playerAvatar.playerDeathHead) && Object.op_Implicit((Object)(object)__instance.ttsVoice))
			{
				((Component)__instance).transform.position = Vector3.Lerp(((Component)__instance).transform.position, ((Component)___playerAvatar.playerDeathHead).transform.position, 30f * Time.deltaTime);
			}
		}

		public static bool IsLocalPlayerDead()
		{
			return IsPlayerDead(PlayerAvatar.instance);
		}

		public static bool IsPlayerDead(PlayerAvatar playerAvatar)
		{
			return Object.op_Implicit((Object)(object)playerAvatar) && (bool)isDisabledField.GetValue(playerAvatar) && (!Object.op_Implicit((Object)(object)playerAvatar.playerDeathHead) || ((Behaviour)playerAvatar.playerDeathHead).isActiveAndEnabled);
		}
	}
}
namespace REPO_DeadTTS.Config
{
	[Serializable]
	public static class ConfigSettings
	{
		public static ConfigEntry<float> minRandomPitch;

		public static ConfigEntry<float> maxRandomPitch;

		public static ConfigEntry<float> deadTTSVolume;

		public static ConfigEntry<bool> displayDeadTTSText;

		public static ConfigEntry<bool> useSpatialAudioDeadTTS;

		public static ConfigEntry<bool> onlyEnableWhenDiscovered;

		public static ConfigEntry<bool> disableWhileDead;

		public static ConfigEntry<string> deadTTSColor;

		public static ConfigEntry<bool> fixMissingDeathHeads;

		public static ConfigEntry<bool> verboseLogs;

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

		internal static void BindConfigSettings()
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Expected O, but got Unknown
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Expected O, but got Unknown
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Expected O, but got Unknown
			//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b0: Expected O, but got Unknown
			//IL_01da: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e4: Expected O, but got Unknown
			//IL_020e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0218: Expected O, but got Unknown
			Plugin.Log("Binding Configs");
			minRandomPitch = AddConfigEntry<float>(((BaseUnityPlugin)Plugin.instance).Config.Bind<float>("General", "Dead TTS Random Pitch Min", 0.8f, new ConfigDescription("The lower range limit when randomizing dead players pitch.\nValues will be clamped between 0.8 and 2.0", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.8f, 2f), Array.Empty<object>())));
			maxRandomPitch = AddConfigEntry<float>(((BaseUnityPlugin)Plugin.instance).Config.Bind<float>("General", "Dead TTS Random Pitch Max", 1.5f, new ConfigDescription("The upper range limit when randomizing dead players pitch.\nValues will be clamped between 0.8 and 2.0", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.8f, 2f), Array.Empty<object>())));
			deadTTSVolume = AddConfigEntry<float>(((BaseUnityPlugin)Plugin.instance).Config.Bind<float>("General", "Dead TTS Volume", 0.5f, new ConfigDescription("Affects the TTS volume of all dead players.\nSet to 0 to mute the TTS of dead players. If muted, the TTS text will still appear.\nValues will be clamped between 0.0 and 1.0", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())));
			displayDeadTTSText = AddConfigEntry<bool>(((BaseUnityPlugin)Plugin.instance).Config.Bind<bool>("General", "Display Dead TTS Text", true, "If true, TTS Text will appear from dead players' heads."));
			useSpatialAudioDeadTTS = AddConfigEntry<bool>(((BaseUnityPlugin)Plugin.instance).Config.Bind<bool>("General", "Use Spatial Audio", true, "If true, TTS audio from dead players should be 3D directional.\nIf false, the audio should appear as if it's in your head all the time."));
			onlyEnableWhenDiscovered = AddConfigEntry<bool>(((BaseUnityPlugin)Plugin.instance).Config.Bind<bool>("General", "Enable When Discovered", false, "If true, you will only hear DeadTTS from players once their head is \"discovered\"."));
			disableWhileDead = AddConfigEntry<bool>(((BaseUnityPlugin)Plugin.instance).Config.Bind<bool>("General", "Disable While Dead", false, "Dead TTS will be disabled while you are dead."));
			deadTTSColor = AddConfigEntry<string>(((BaseUnityPlugin)Plugin.instance).Config.Bind<string>("General", "Dead TTS Text Color Hex", "CC3333", new ConfigDescription("Hex color value for dead TTS text color. Hex string must be 6 characters long. Leave this field blank to use the vanilla TTS color.", (AcceptableValueBase)null, Array.Empty<object>())));
			fixMissingDeathHeads = AddConfigEntry<bool>(((BaseUnityPlugin)Plugin.instance).Config.Bind<bool>("General", "Fix Missing Death Heads", true, new ConfigDescription("Fixes an uncommon bug where the game may not assign a player a death head.", (AcceptableValueBase)null, Array.Empty<object>())));
			verboseLogs = AddConfigEntry<bool>(((BaseUnityPlugin)Plugin.instance).Config.Bind<bool>("General", "Verbose Logs", false, new ConfigDescription("Enables verbose logs. Useful for debugging.", (AcceptableValueBase)null, Array.Empty<object>())));
			if (minRandomPitch.Value < 0.8f)
			{
				minRandomPitch.Value = (float)((ConfigEntryBase)minRandomPitch).DefaultValue;
			}
			if (maxRandomPitch.Value > 2f)
			{
				maxRandomPitch.Value = (float)((ConfigEntryBase)maxRandomPitch).DefaultValue;
			}
			minRandomPitch.Value = Mathf.Clamp(minRandomPitch.Value, 0.8f, 2f);
			maxRandomPitch.Value = Mathf.Max(maxRandomPitch.Value, minRandomPitch.Value);
			deadTTSVolume.Value = Mathf.Clamp(deadTTSVolume.Value, 0f, 2f);
			deadTTSColor.Value = deadTTSColor.Value.Trim(new char[1] { ' ' });
		}

		internal static ConfigEntry<T> AddConfigEntry<T>(ConfigEntry<T> configEntry)
		{
			currentConfigEntries.Add(((ConfigEntryBase)configEntry).Definition.Key, (ConfigEntryBase)(object)configEntry);
			return configEntry;
		}
	}
}

plugins/REPOConfig.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using MenuLib;
using MenuLib.MonoBehaviors;
using MenuLib.Structs;
using Microsoft.CodeAnalysis;
using MonoMod.RuntimeDetour;
using TMPro;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("REPOConfig")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.2.3")]
[assembly: AssemblyInformationalVersion("1.1.8+0e6abbd5173e15b6a0a267663eda01dba538620d")]
[assembly: AssemblyProduct("REPOConfig")]
[assembly: AssemblyTitle("REPOConfig")]
[assembly: AssemblyVersion("1.2.3.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace REPOConfig
{
	internal sealed class ConfigMenu
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static BuilderDelegate <>9__5_0;

			public static BuilderDelegate <>9__5_1;

			public static Action <>9__6_4;

			public static Action <>9__6_8;

			public static Action <>9__7_3;

			public static ShouldCloseMenuDelegate <>9__7_5;

			public static Action <>9__7_10;

			public static BuilderDelegate <>9__7_6;

			public static ScrollViewBuilderDelegate <>9__7_9;

			public static Func<ConfigEntryBase, string> <>9__8_0;

			public static ScrollViewBuilderDelegate <>9__8_2;

			public static Func<PluginInfo, string> <>9__9_0;

			public static Func<KeyValuePair<ConfigDefinition, ConfigEntryBase>, ConfigEntryBase> <>9__9_1;

			internal void <Initialize>b__5_0(Transform parent)
			{
				//IL_002b: Unknown result type (might be due to invalid IL or missing references)
				((TMP_Text)MenuAPI.CreateREPOButton("Mods", (Action)CreateModMenu, parent, new Vector2(186f, 32f)).labelTMP).fontSize = 28f;
			}

			internal void <Initialize>b__5_1(Transform parent)
			{
				//IL_002b: Unknown result type (might be due to invalid IL or missing references)
				MenuAPI.CreateREPOButton("Mods", (Action)CreateModMenu, parent, new Vector2(126f, 86f));
			}

			internal void <CreateModMenu>b__6_4()
			{
				hasPopupMenuOpened = false;
			}

			internal void <CreateModMenu>b__6_8()
			{
				hasPopupMenuOpened = false;
			}

			internal void <CreateModList>b__7_3()
			{
				hasPopupMenuOpened = false;
			}

			internal bool <CreateModList>b__7_5()
			{
				if (!hasPopupMenuOpened)
				{
					return changedEntryValues.Count == 0;
				}
				return false;
			}

			internal void <CreateModList>b__7_6(Transform mainPageParent)
			{
				//IL_002f: Unknown result type (might be due to invalid IL or missing references)
				MenuAPI.CreateREPOButton("Save Changes", (Action)delegate
				{
					KeyValuePair<ConfigEntryBase, object>[] array = changedEntryValues.ToArray();
					changedEntryValues.Clear();
					KeyValuePair<ConfigEntryBase, object>[] array2 = array;
					for (int i = 0; i < array2.Length; i++)
					{
						KeyValuePair<ConfigEntryBase, object> keyValuePair = array2[i];
						var (val2, obj2) = (KeyValuePair<ConfigEntryBase, object>)(ref keyValuePair);
						object value = (val2.BoxedValue = obj2);
						originalEntryValues[val2] = value;
					}
				}, mainPageParent, new Vector2(370f, 18f));
			}

			internal void <CreateModList>b__7_10()
			{
				KeyValuePair<ConfigEntryBase, object>[] array = changedEntryValues.ToArray();
				changedEntryValues.Clear();
				KeyValuePair<ConfigEntryBase, object>[] array2 = array;
				for (int i = 0; i < array2.Length; i++)
				{
					KeyValuePair<ConfigEntryBase, object> keyValuePair = array2[i];
					var (val2, obj2) = (KeyValuePair<ConfigEntryBase, object>)(ref keyValuePair);
					object value = (val2.BoxedValue = obj2);
					originalEntryValues[val2] = value;
				}
			}

			internal RectTransform <CreateModList>b__7_9(Transform scrollView)
			{
				//IL_0014: Unknown result type (might be due to invalid IL or missing references)
				//IL_001a: Unknown result type (might be due to invalid IL or missing references)
				//IL_001b: Unknown result type (might be due to invalid IL or missing references)
				Vector2 val = default(Vector2);
				((Vector2)(ref val))..ctor(0f, 10f);
				return ((REPOElement)MenuAPI.CreateREPOSpacer(scrollView, default(Vector2), val)).rectTransform;
			}

			internal string <CreateModEntries>b__8_0(ConfigEntryBase entry)
			{
				return entry.Definition.Section;
			}

			internal RectTransform <CreateModEntries>b__8_2(Transform scrollView)
			{
				//IL_0014: Unknown result type (might be due to invalid IL or missing references)
				//IL_001a: Unknown result type (might be due to invalid IL or missing references)
				//IL_001b: Unknown result type (might be due to invalid IL or missing references)
				Vector2 val = default(Vector2);
				((Vector2)(ref val))..ctor(0f, 20f);
				return ((REPOElement)MenuAPI.CreateREPOSpacer(scrollView, default(Vector2), val)).rectTransform;
			}

			internal string <GetModConfigEntries>b__9_0(PluginInfo p)
			{
				return p.Metadata.Name;
			}

			internal ConfigEntryBase <GetModConfigEntries>b__9_1(KeyValuePair<ConfigDefinition, ConfigEntryBase> configEntry)
			{
				return configEntry.Value;
			}
		}

		private static readonly Dictionary<ConfigEntryBase, object> changedEntryValues = new Dictionary<ConfigEntryBase, object>();

		private static readonly Dictionary<ConfigEntryBase, object> originalEntryValues = new Dictionary<ConfigEntryBase, object>();

		internal static REPOButton lastClickedModButton;

		private static readonly List<REPOButton> currentModButtons = new List<REPOButton>();

		private static bool hasPopupMenuOpened;

		internal static void Initialize()
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Expected O, but got Unknown
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Expected O, but got Unknown
			object obj = <>c.<>9__5_0;
			if (obj == null)
			{
				BuilderDelegate val = delegate(Transform parent)
				{
					//IL_002b: Unknown result type (might be due to invalid IL or missing references)
					((TMP_Text)MenuAPI.CreateREPOButton("Mods", (Action)CreateModMenu, parent, new Vector2(186f, 32f)).labelTMP).fontSize = 28f;
				};
				<>c.<>9__5_0 = val;
				obj = (object)val;
			}
			MenuAPI.AddElementToLobbyMenu((BuilderDelegate)obj);
			object obj2 = <>c.<>9__5_1;
			if (obj2 == null)
			{
				BuilderDelegate val2 = delegate(Transform parent)
				{
					//IL_002b: Unknown result type (might be due to invalid IL or missing references)
					MenuAPI.CreateREPOButton("Mods", (Action)CreateModMenu, parent, new Vector2(126f, 86f));
				};
				<>c.<>9__5_1 = val2;
				obj2 = (object)val2;
			}
			MenuAPI.AddElementToEscapeMenu((BuilderDelegate)obj2);
		}

		internal static void CreateModMenu()
		{
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Expected O, but got Unknown
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Expected O, but got Unknown
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Expected O, but got Unknown
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Expected O, but got Unknown
			changedEntryValues.Clear();
			lastClickedModButton = null;
			REPOPopupPage repoPopupPage = MenuAPI.CreateREPOPopupPage("Mods", (PresetSide)0, false, true, 0f);
			repoPopupPage.scrollView.scrollSpeed = 3f;
			REPOPopupPage obj = repoPopupPage;
			Padding maskPadding = repoPopupPage.maskPadding;
			maskPadding.top = 35f;
			obj.maskPadding = maskPadding;
			REPOPopupPage obj2 = repoPopupPage;
			obj2.onEscapePressed = (ShouldCloseMenuDelegate)Delegate.Combine((Delegate?)(object)obj2.onEscapePressed, (Delegate?)(ShouldCloseMenuDelegate)delegate
			{
				//IL_001c: Unknown result type (might be due to invalid IL or missing references)
				if (hasPopupMenuOpened)
				{
					return false;
				}
				if (changedEntryValues.Count == 0)
				{
					return true;
				}
				MenuAPI.OpenPopup("Unsaved Changes", Color.red, "You have unsaved changes, are you sure you want to exit?", (Action)delegate
				{
					repoPopupPage.ClosePage(true);
					changedEntryValues.Clear();
					hasPopupMenuOpened = false;
				}, (Action)delegate
				{
					hasPopupMenuOpened = false;
				});
				hasPopupMenuOpened = true;
				return false;
			});
			repoPopupPage.AddElement((BuilderDelegate)delegate(Transform parent)
			{
				//IL_002f: 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_0053: Unknown result type (might be due to invalid IL or missing references)
				((Component)MenuAPI.CreateREPOInputField("Mod Search", (Action<string>)delegate(string s)
				{
					string text = (string.IsNullOrEmpty(s) ? null : s.ToLower().Trim());
					foreach (REPOButton currentModButton in currentModButtons)
					{
						((REPOElement)currentModButton).repoScrollViewElement.visibility = text == null || ((TMP_Text)currentModButton.labelTMP).text.ToLower().Contains(text);
					}
					repoPopupPage.scrollView.SetScrollPosition(0f);
				}, parent, new Vector2(83f, 272f), false, "", "")).transform.localScale = Vector3.one * 0.95f;
			});
			CreateModList(repoPopupPage);
			repoPopupPage.AddElement((BuilderDelegate)delegate(Transform parent)
			{
				//IL_002f: Unknown result type (might be due to invalid IL or missing references)
				MenuAPI.CreateREPOButton("Back", (Action)delegate
				{
					//IL_0025: Unknown result type (might be due to invalid IL or missing references)
					if (changedEntryValues.Count == 0 || hasPopupMenuOpened)
					{
						repoPopupPage.ClosePage(true);
					}
					else
					{
						MenuAPI.OpenPopup("Unsaved Changes", Color.red, "You have unsaved changes, are you sure you want to exit?", (Action)delegate
						{
							repoPopupPage.ClosePage(true);
							changedEntryValues.Clear();
							hasPopupMenuOpened = false;
						}, (Action)delegate
						{
							hasPopupMenuOpened = false;
						});
						hasPopupMenuOpened = true;
					}
				}, parent, new Vector2(66f, 18f));
			});
			repoPopupPage.OpenPage(false);
		}

		private static void CreateModList(REPOPopupPage mainModPage)
		{
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Expected O, but got Unknown
			currentModButtons.Clear();
			foreach (KeyValuePair<string, ConfigEntryBase[]> modConfigEntry in GetModConfigEntries())
			{
				var (modName, configEntryBases) = (KeyValuePair<string, ConfigEntryBase[]>)(ref modConfigEntry);
				mainModPage.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform parent)
				{
					//IL_0018: Unknown result type (might be due to invalid IL or missing references)
					//IL_001e: Unknown result type (might be due to invalid IL or missing references)
					//IL_0055: Unknown result type (might be due to invalid IL or missing references)
					//IL_005a: Unknown result type (might be due to invalid IL or missing references)
					//IL_0067: Unknown result type (might be due to invalid IL or missing references)
					REPOButton modButton = MenuAPI.CreateREPOButton(modName, (Action)null, parent, default(Vector2));
					((TMP_Text)modButton.labelTMP).fontStyle = (FontStyles)0;
					if (modName.Length > 24)
					{
						REPOButton obj = modButton;
						Vector2 labelSize = modButton.GetLabelSize();
						labelSize.x = 250f;
						obj.overrideButtonSize = labelSize;
						REPOTextScroller val = ((Component)modButton.labelTMP).gameObject.AddComponent<REPOTextScroller>();
						val.maxCharacters = 24;
						((MonoBehaviour)MenuManager.instance).StartCoroutine(val.Animate());
					}
					BuilderDelegate val2 = default(BuilderDelegate);
					modButton.onClick = delegate
					{
						//IL_002b: Unknown result type (might be due to invalid IL or missing references)
						if (!((Object)(object)lastClickedModButton == (Object)(object)modButton))
						{
							if (changedEntryValues.Count == 0)
							{
								OpenPage();
							}
							else
							{
								MenuAPI.OpenPopup("Unsaved Changes", Color.red, "You have unsaved changes, are you sure you want to exit?", (Action)delegate
								{
									changedEntryValues.Clear();
									OpenPage();
									hasPopupMenuOpened = false;
								}, (Action)delegate
								{
									hasPopupMenuOpened = false;
								});
								hasPopupMenuOpened = true;
							}
						}
					};
					currentModButtons.Add(modButton);
					return ((REPOElement)modButton).rectTransform;
					void OpenPage()
					{
						//IL_0064: 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_006f: Expected O, but got Unknown
						//IL_008e: Unknown result type (might be due to invalid IL or missing references)
						//IL_0093: Unknown result type (might be due to invalid IL or missing references)
						//IL_0099: Expected O, but got Unknown
						//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
						//IL_00e9: Expected O, but got Unknown
						//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
						//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
						//IL_00bd: Expected O, but got Unknown
						//IL_00c2: Expected O, but got Unknown
						//IL_0103: Unknown result type (might be due to invalid IL or missing references)
						//IL_0108: Unknown result type (might be due to invalid IL or missing references)
						//IL_010e: Expected O, but got Unknown
						MenuAPI.CloseAllPagesAddedOnTop();
						REPOPopupPage modPage = MenuAPI.CreateREPOPopupPage(modName, (PresetSide)1, false, false, 5f);
						modPage.scrollView.scrollSpeed = 3f;
						REPOPopupPage obj3 = modPage;
						object obj4 = <>c.<>9__7_5;
						if (obj4 == null)
						{
							ShouldCloseMenuDelegate val3 = () => !hasPopupMenuOpened && changedEntryValues.Count == 0;
							<>c.<>9__7_5 = val3;
							obj4 = (object)val3;
						}
						obj3.onEscapePressed = (ShouldCloseMenuDelegate)obj4;
						REPOPopupPage obj5 = modPage;
						object obj6 = <>c.<>9__7_6;
						if (obj6 == null)
						{
							BuilderDelegate val4 = delegate(Transform mainPageParent)
							{
								//IL_002f: Unknown result type (might be due to invalid IL or missing references)
								MenuAPI.CreateREPOButton("Save Changes", (Action)delegate
								{
									KeyValuePair<ConfigEntryBase, object>[] array3 = changedEntryValues.ToArray();
									changedEntryValues.Clear();
									KeyValuePair<ConfigEntryBase, object>[] array4 = array3;
									for (int j = 0; j < array4.Length; j++)
									{
										KeyValuePair<ConfigEntryBase, object> keyValuePair2 = array4[j];
										var (val11, obj12) = (KeyValuePair<ConfigEntryBase, object>)(ref keyValuePair2);
										object value = (val11.BoxedValue = obj12);
										originalEntryValues[val11] = value;
									}
								}, mainPageParent, new Vector2(370f, 18f));
							};
							<>c.<>9__7_6 = val4;
							obj6 = (object)val4;
						}
						obj5.AddElement((BuilderDelegate)obj6);
						REPOPopupPage obj7 = modPage;
						BuilderDelegate obj8 = val2;
						if (obj8 == null)
						{
							BuilderDelegate val5 = delegate(Transform mainPageParent)
							{
								//IL_002f: Unknown result type (might be due to invalid IL or missing references)
								MenuAPI.CreateREPOButton("Revert", (Action)delegate
								{
									if (changedEntryValues.Count != 0)
									{
										changedEntryValues.Clear();
										OpenPage();
									}
								}, mainPageParent, new Vector2(585f, 18f));
							};
							BuilderDelegate val6 = val5;
							val2 = val5;
							obj8 = val6;
						}
						obj7.AddElement(obj8);
						modPage.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView)
						{
							//IL_0036: Unknown result type (might be due to invalid IL or missing references)
							//IL_003c: Unknown result type (might be due to invalid IL or missing references)
							//IL_0054: Unknown result type (might be due to invalid IL or missing references)
							//IL_0059: Unknown result type (might be due to invalid IL or missing references)
							//IL_0062: Unknown result type (might be due to invalid IL or missing references)
							//IL_0078: Unknown result type (might be due to invalid IL or missing references)
							//IL_007d: Unknown result type (might be due to invalid IL or missing references)
							REPOButton val9 = MenuAPI.CreateREPOButton("Reset To Default", (Action)delegate
							{
								//IL_0059: Unknown result type (might be due to invalid IL or missing references)
								MenuAPI.OpenPopup("Reset " + modName + "'" + (modName.ToLower().EndsWith('s') ? string.Empty : "s") + " settings?", Color.red, "Are you sure you want to reset all settings back to default?", (Action)ResetToDefault, (Action)null);
							}, scrollView, default(Vector2));
							RectTransform rectTransform = ((REPOElement)val9).rectTransform;
							Rect rect = modPage.maskRectTransform.rect;
							((Transform)rectTransform).localPosition = Vector2.op_Implicit(new Vector2((((Rect)(ref rect)).width - val9.GetLabelSize().x) * 0.5f, 0f));
							return ((REPOElement)val9).rectTransform;
						}, 0f, 0f);
						REPOPopupPage obj9 = modPage;
						object obj10 = <>c.<>9__7_9;
						if (obj10 == null)
						{
							ScrollViewBuilderDelegate val7 = delegate(Transform scrollView)
							{
								//IL_0014: Unknown result type (might be due to invalid IL or missing references)
								//IL_001a: Unknown result type (might be due to invalid IL or missing references)
								//IL_001b: Unknown result type (might be due to invalid IL or missing references)
								Vector2 val8 = default(Vector2);
								((Vector2)(ref val8))..ctor(0f, 10f);
								return ((REPOElement)MenuAPI.CreateREPOSpacer(scrollView, default(Vector2), val8)).rectTransform;
							};
							<>c.<>9__7_9 = val7;
							obj10 = (object)val7;
						}
						obj9.AddElementToScrollView((ScrollViewBuilderDelegate)obj10, 0f, 0f);
						CreateModEntries(modPage, configEntryBases);
						modPage.OpenPage(true);
						lastClickedModButton = modButton;
					}
					void ResetToDefault()
					{
						ConfigEntryBase[] array2 = configEntryBases;
						foreach (ConfigEntryBase obj2 in array2)
						{
							obj2.BoxedValue = obj2.DefaultValue;
						}
						changedEntryValues.Clear();
						OpenPage();
					}
				}, 0f, 0f);
			}
		}

		private static void CreateModEntries(REPOPopupPage modPage, ConfigEntryBase[] configEntryBases)
		{
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Expected O, but got Unknown
			//IL_0154: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Expected O, but got Unknown
			//IL_017b: Unknown result type (might be due to invalid IL or missing references)
			//IL_018f: Expected O, but got Unknown
			//IL_02ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f8: Expected O, but got Unknown
			//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b6: Expected O, but got Unknown
			//IL_021f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0233: Expected O, but got Unknown
			//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_020c: Expected O, but got Unknown
			//IL_02ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c1: Expected O, but got Unknown
			foreach (IGrouping<string, ConfigEntryBase> group in from entry in configEntryBases
				group entry by entry.Definition.Section)
			{
				modPage.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView)
				{
					//IL_0013: Unknown result type (might be due to invalid IL or missing references)
					//IL_0019: Unknown result type (might be due to invalid IL or missing references)
					REPOLabel obj7 = MenuAPI.CreateREPOLabel(FixNaming(group.Key), scrollView, default(Vector2));
					((TMP_Text)obj7.labelTMP).fontStyle = (FontStyles)1;
					return ((REPOElement)obj7).rectTransform;
				}, 0f, 0f);
				foreach (ConfigEntryBase entry2 in group)
				{
					string modName = FixNaming(entry2.Definition.Key);
					originalEntryValues.Remove(entry2);
					originalEntryValues.Add(entry2, entry2.BoxedValue);
					ConfigEntryBase val = entry2;
					if (!(val is ConfigEntry<bool>))
					{
						if (!(val is ConfigEntry<float>))
						{
							if (!(val is ConfigEntry<int>))
							{
								if (!(val is ConfigEntry<string>))
								{
									if (val == null || !entry2.SettingType.IsSubclassOf(typeof(Enum)))
									{
										continue;
									}
									Type enumType = entry2.SettingType;
									string[] values = Enum.GetNames(enumType);
									modPage.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView)
									{
										//IL_005c: Unknown result type (might be due to invalid IL or missing references)
										//IL_0062: Unknown result type (might be due to invalid IL or missing references)
										//IL_0082: Unknown result type (might be due to invalid IL or missing references)
										//IL_0088: Unknown result type (might be due to invalid IL or missing references)
										REPOSlider val11 = MenuAPI.CreateREPOSlider(modName, string.Empty, (Action<int>)delegate(int i)
										{
											object obj6 = Enum.Parse(enumType, values[i]);
											if (originalEntryValues.TryGetValue(entry2, out var value6) && obj6 == value6)
											{
												changedEntryValues.Remove(entry2);
											}
											else
											{
												changedEntryValues[entry2] = obj6;
											}
										}, scrollView, values, entry2.BoxedValue.ToString(), default(Vector2), "", "", (BarBehavior)0);
										TextMeshProUGUI descriptionTMP4 = val11.descriptionTMP;
										TextMeshProUGUI labelTMP5 = val11.labelTMP;
										FontStyles fontStyle5 = (FontStyles)0;
										((TMP_Text)labelTMP5).fontStyle = (FontStyles)0;
										((TMP_Text)descriptionTMP4).fontStyle = fontStyle5;
										return ((REPOElement)val11).rectTransform;
									}, 0f, 0f);
									continue;
								}
								AcceptableValueBase acceptableValues = entry2.Description.AcceptableValues;
								AcceptableValueList<string> val2 = acceptableValues as AcceptableValueList<string>;
								if (val2 != null)
								{
									modPage.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView)
									{
										//IL_0075: 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_009b: 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)
										REPOSlider val10 = MenuAPI.CreateREPOSlider(modName, string.Empty, (Action<string>)delegate(string s)
										{
											if (originalEntryValues.TryGetValue(entry2, out var value5) && s == (string)value5)
											{
												changedEntryValues.Remove(entry2);
											}
											else
											{
												changedEntryValues[entry2] = s;
											}
										}, scrollView, val2.AcceptableValues, (string)entry2.BoxedValue, default(Vector2), "", "", (BarBehavior)0);
										TextMeshProUGUI descriptionTMP3 = val10.descriptionTMP;
										TextMeshProUGUI labelTMP4 = val10.labelTMP;
										FontStyles fontStyle4 = (FontStyles)0;
										((TMP_Text)labelTMP4).fontStyle = (FontStyles)0;
										((TMP_Text)descriptionTMP3).fontStyle = fontStyle4;
										return ((REPOElement)val10).rectTransform;
									}, 0f, 0f);
									continue;
								}
								modPage.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView)
								{
									//IL_004b: Unknown result type (might be due to invalid IL or missing references)
									//IL_008f: Unknown result type (might be due to invalid IL or missing references)
									//IL_0095: Unknown result type (might be due to invalid IL or missing references)
									string text4 = (string)entry2.DefaultValue;
									REPOInputField val9 = MenuAPI.CreateREPOInputField(modName, (Action<string>)delegate(string s)
									{
										if (originalEntryValues.TryGetValue(entry2, out var value4) && s == (string)value4)
										{
											changedEntryValues.Remove(entry2);
										}
										else
										{
											changedEntryValues[entry2] = s;
										}
									}, scrollView, Vector2.zero, false, (!string.IsNullOrEmpty(text4)) ? text4 : "<NONE>", (string)entry2.BoxedValue);
									TextMeshProUGUI labelTMP3 = val9.labelTMP;
									TMP_Text inputTMP = val9.inputStringSystem.inputTMP;
									FontStyles fontStyle3 = (FontStyles)0;
									inputTMP.fontStyle = (FontStyles)0;
									((TMP_Text)labelTMP3).fontStyle = fontStyle3;
									return ((REPOElement)val9).rectTransform;
								}, 0f, 0f);
								continue;
							}
							modPage.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView)
							{
								//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
								//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
								//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
								//IL_0103: Unknown result type (might be due to invalid IL or missing references)
								int num9;
								int num10;
								int num12;
								if (entry2.Description.AcceptableValues is AcceptableValueRange<int> val7)
								{
									num9 = val7.MinValue;
									num10 = val7.MaxValue;
								}
								else
								{
									int num11 = Math.Abs((int)entry2.BoxedValue);
									num12 = ((num11 > 100) ? (-(num10 = num11 * 2)) : ((num11 != 0) ? (-(num10 = num11 * 3)) : (-(num10 = 100))));
									num9 = num12;
								}
								string text3 = modName;
								string empty2 = string.Empty;
								Action<int> obj5 = delegate(int i)
								{
									if (originalEntryValues.TryGetValue(entry2, out var value3) && i == (int)value3)
									{
										changedEntryValues.Remove(entry2);
									}
									else
									{
										changedEntryValues[entry2] = i;
									}
								};
								num12 = (int)entry2.BoxedValue;
								int num13 = num9;
								int num14 = num10;
								REPOSlider val8 = MenuAPI.CreateREPOSlider(text3, empty2, obj5, scrollView, default(Vector2), num13, num14, num12, "", "", (BarBehavior)0);
								TextMeshProUGUI descriptionTMP2 = val8.descriptionTMP;
								TextMeshProUGUI labelTMP2 = val8.labelTMP;
								FontStyles fontStyle2 = (FontStyles)0;
								((TMP_Text)labelTMP2).fontStyle = (FontStyles)0;
								((TMP_Text)descriptionTMP2).fontStyle = fontStyle2;
								return ((REPOElement)val8).rectTransform;
							}, 0f, 0f);
							continue;
						}
						modPage.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView)
						{
							//IL_0155: Unknown result type (might be due to invalid IL or missing references)
							//IL_015b: Unknown result type (might be due to invalid IL or missing references)
							//IL_0187: Unknown result type (might be due to invalid IL or missing references)
							//IL_018e: Unknown result type (might be due to invalid IL or missing references)
							int num = 2;
							float num2;
							float num3;
							if (entry2.Description.AcceptableValues is AcceptableValueRange<float> val5)
							{
								num2 = val5.MinValue;
								num3 = val5.MaxValue;
								num = Mathf.Max(new int[4]
								{
									GetDecimalPlaces(num2),
									GetDecimalPlaces(num3),
									GetDecimalPlaces((float)entry2.DefaultValue),
									2
								});
							}
							else
							{
								float num4 = Math.Abs((float)entry2.BoxedValue);
								num2 = ((num4 == 0f) ? (0f - (num3 = 100f)) : (((double)num4 <= 0.001) ? (0f - (num3 = 10f)) : (((double)num4 <= 0.01) ? (0f - (num3 = 50f)) : ((!(num4 <= 100f)) ? (0f - (num3 = num4 * 2f)) : (0f - (num3 = num4 * 3f))))));
							}
							string text2 = modName;
							string empty = string.Empty;
							Action<float> obj4 = delegate(float f)
							{
								if (originalEntryValues.TryGetValue(entry2, out var value2) && Math.Abs(f - (float)value2) < float.Epsilon)
								{
									changedEntryValues.Remove(entry2);
								}
								else
								{
									changedEntryValues[entry2] = f;
								}
							};
							float num5 = (float)entry2.BoxedValue;
							float num6 = num2;
							float num7 = num3;
							int num8 = num;
							REPOSlider val6 = MenuAPI.CreateREPOSlider(text2, empty, obj4, scrollView, default(Vector2), num6, num7, num8, num5, "", "", (BarBehavior)0);
							TextMeshProUGUI descriptionTMP = val6.descriptionTMP;
							TextMeshProUGUI labelTMP = val6.labelTMP;
							FontStyles fontStyle = (FontStyles)0;
							((TMP_Text)labelTMP).fontStyle = (FontStyles)0;
							((TMP_Text)descriptionTMP).fontStyle = fontStyle;
							return ((REPOElement)val6).rectTransform;
						}, 0f, 0f);
						continue;
					}
					modPage.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView)
					{
						//IL_004d: Unknown result type (might be due to invalid IL or missing references)
						//IL_0053: Unknown result type (might be due to invalid IL or missing references)
						string text = modName;
						Action<bool> obj2 = delegate(bool b)
						{
							if (originalEntryValues.TryGetValue(entry2, out var value) && b == (bool)value)
							{
								changedEntryValues.Remove(entry2);
							}
							else
							{
								changedEntryValues[entry2] = b;
							}
						};
						bool flag = (bool)entry2.BoxedValue;
						REPOToggle obj3 = MenuAPI.CreateREPOToggle(text, obj2, scrollView, default(Vector2), "ON", "OFF", flag);
						((TMP_Text)obj3.labelTMP).fontStyle = (FontStyles)0;
						return ((REPOElement)obj3).rectTransform;
					}, 0f, 0f);
				}
				object obj = <>c.<>9__8_2;
				if (obj == null)
				{
					ScrollViewBuilderDelegate val3 = delegate(Transform scrollView)
					{
						//IL_0014: Unknown result type (might be due to invalid IL or missing references)
						//IL_001a: Unknown result type (might be due to invalid IL or missing references)
						//IL_001b: Unknown result type (might be due to invalid IL or missing references)
						Vector2 val4 = default(Vector2);
						((Vector2)(ref val4))..ctor(0f, 20f);
						return ((REPOElement)MenuAPI.CreateREPOSpacer(scrollView, default(Vector2), val4)).rectTransform;
					};
					<>c.<>9__8_2 = val3;
					obj = (object)val3;
				}
				modPage.AddElementToScrollView((ScrollViewBuilderDelegate)obj, 0f, 0f);
			}
		}

		private static Dictionary<string, ConfigEntryBase[]> GetModConfigEntries()
		{
			Dictionary<string, ConfigEntryBase[]> dictionary = new Dictionary<string, ConfigEntryBase[]>();
			foreach (PluginInfo item in Chainloader.PluginInfos.Values.OrderBy((PluginInfo p) => p.Metadata.Name))
			{
				List<ConfigEntryBase> list = new List<ConfigEntryBase>();
				foreach (ConfigEntryBase item2 in ((IEnumerable<KeyValuePair<ConfigDefinition, ConfigEntryBase>>)item.Instance.Config).Select((KeyValuePair<ConfigDefinition, ConfigEntryBase> configEntry) => configEntry.Value))
				{
					ConfigDescription description = item2.Description;
					object[] array = ((description != null) ? description.Tags : null);
					if (array == null || (!array.Contains("HideREPOConfig") && !array.Contains("HideFromREPOConfig")))
					{
						list.Add(item2);
					}
				}
				if (list.Count > 0)
				{
					dictionary.TryAdd(FixNaming(item.Metadata.Name), list.ToArray());
				}
			}
			return dictionary;
		}

		private static string FixNaming(string input)
		{
			input = Regex.Replace(input, "([a-z])([A-Z])", "$1 $2");
			input = Regex.Replace(input, "([A-Z])([A-Z][a-z])", "$1 $2");
			input = Regex.Replace(input, "\\s+", " ");
			input = Regex.Replace(input, "([A-Z]\\.)\\s([A-Z]\\.)", "$1$2");
			return input.Trim();
		}

		private static int GetDecimalPlaces(float value)
		{
			string text = value.ToString(CultureInfo.InvariantCulture);
			int num = text.IndexOf('.');
			if (num != -1)
			{
				string text2 = text;
				int num2 = num + 1;
				return text2.Substring(num2, text2.Length - num2).Length;
			}
			return 0;
		}
	}
	[BepInPlugin("nickklmao.repoconfig", "REPOConfig", "1.2.3")]
	[BepInDependency("nickklmao.menulib", "2.5.0")]
	internal sealed class Entry : BaseUnityPlugin
	{
		private const string MOD_NAME = "REPOConfig";

		internal static readonly ManualLogSource logger = Logger.CreateLogSource("REPOConfig");

		private static ConfigEntry<bool> showInGame;

		private static void MenuPageMain_StartHook(Action<MenuPageMain> orig, MenuPageMain self)
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			REPOButton val = MenuAPI.CreateREPOButton("Mods", (Action)ConfigMenu.CreateModMenu, ((Component)self).transform, new Vector2(48.3f, 0f));
			List<Transform> list = (from Transform transform in (IEnumerable)((Component)self).transform
				where ((Object)transform).name.Contains("Menu Button")
				orderby transform.localPosition.y descending
				select transform).ToList();
			list.Insert(list.Count - 1, ((Component)val).transform);
			float num = 224f;
			foreach (Transform item in list)
			{
				Vector3 localPosition = item.localPosition;
				localPosition.y = num;
				item.localPosition = localPosition;
				num -= 30f;
			}
			orig(self);
		}

		private void Awake()
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Expected O, but got Unknown
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			showInGame = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Show In Game", true, new ConfigDescription(string.Empty, (AcceptableValueBase)null, new object[1] { "HideFromREPOConfig" }));
			if (showInGame.Value)
			{
				logger.LogDebug((object)"Hooking `MenuPageMain.Start`");
				new Hook((MethodBase)AccessTools.Method(typeof(MenuPageMain), "Start", (Type[])null, (Type[])null), (Delegate)new Action<Action<MenuPageMain>, MenuPageMain>(MenuPageMain_StartHook));
				ConfigMenu.Initialize();
			}
		}
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
	[Obsolete("This attribute is not used and will be removed eventually.")]
	public class REPOConfigEntryAttribute : Attribute
	{
		public REPOConfigEntryAttribute(string displayName)
		{
		}

		public REPOConfigEntryAttribute(string displayName, int min, int max, string prefix = "", string postfix = "")
		{
		}

		public REPOConfigEntryAttribute(string displayName, float min, float max, string prefix = "", string postfix = "")
		{
		}

		public REPOConfigEntryAttribute(string displayName, float min, float max, int precision = 2, string prefix = "", string postfix = "")
		{
		}

		public REPOConfigEntryAttribute(string displayName, string prefix = "", string postfix = "")
		{
		}

		public REPOConfigEntryAttribute(string displayName, params string[] customOptions)
		{
		}
	}
}

plugins/RepoDice.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
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 BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using MoreUpgrades;
using MoreUpgrades.Classes;
using Newtonsoft.Json;
using Photon.Pun;
using REPOLib.Modules;
using RepoDice;
using RepoDice.Dice;
using RepoDice.Effects;
using RepoDice.Patches;
using RepoDice.Visual;
using TMPro;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.InputSystem;
using UnityEngine.Rendering;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: IgnoresAccessChecksTo("Autodesk.Fbx")]
[assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")]
[assembly: IgnoresAccessChecksTo("FbxBuildTestAssets")]
[assembly: IgnoresAccessChecksTo("Klattersynth")]
[assembly: IgnoresAccessChecksTo("MoreUpgrades")]
[assembly: IgnoresAccessChecksTo("Photon3Unity3D")]
[assembly: IgnoresAccessChecksTo("PhotonChat")]
[assembly: IgnoresAccessChecksTo("PhotonRealtime")]
[assembly: IgnoresAccessChecksTo("PhotonUnityNetworking")]
[assembly: IgnoresAccessChecksTo("PhotonUnityNetworking.Utilities")]
[assembly: IgnoresAccessChecksTo("PhotonVoice.API")]
[assembly: IgnoresAccessChecksTo("PhotonVoice")]
[assembly: IgnoresAccessChecksTo("PhotonVoice.PUN")]
[assembly: IgnoresAccessChecksTo("SingularityGroup.HotReload.Runtime")]
[assembly: IgnoresAccessChecksTo("SingularityGroup.HotReload.Runtime.Public")]
[assembly: IgnoresAccessChecksTo("Sirenix.OdinInspector.Attributes")]
[assembly: IgnoresAccessChecksTo("Sirenix.Serialization.Config")]
[assembly: IgnoresAccessChecksTo("Sirenix.Serialization")]
[assembly: IgnoresAccessChecksTo("Sirenix.Utilities")]
[assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")]
[assembly: IgnoresAccessChecksTo("Unity.Formats.Fbx.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")]
[assembly: IgnoresAccessChecksTo("Unity.Postprocessing.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")]
[assembly: IgnoresAccessChecksTo("Unity.Timeline")]
[assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Antlr3.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Core")]
[assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Flow")]
[assembly: IgnoresAccessChecksTo("Unity.VisualScripting.State")]
[assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.UI")]
[assembly: IgnoresAccessChecksTo("websocket-sharp")]
[assembly: AssemblyCompany("Slayer6409")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+526197b4302455a205b4e828a796ff4db1cbbd9b")]
[assembly: AssemblyProduct("RepoDice")]
[assembly: AssemblyTitle("RepoDice")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.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;
		}
	}
}
public class CycleSigns : MonoBehaviour
{
	private class DiceVisuals
	{
		public Sprite Sprite;

		public Color ModelColor;

		public Color EmissionColor;

		public float Emission;

		public DiceVisuals(Sprite sprite, Color color, Color emissionColor, float emission)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			Sprite = sprite;
			ModelColor = color;
			EmissionColor = emissionColor;
			Emission = emission;
		}
	}

	public float CycleTime = 1f;

	private float CurrentTimer = 0f;

	private int CurrentSprite = 0;

	private bool Stop = false;

	private SpriteRenderer SignSpriteRenderer;

	private SpriteRenderer SignSpriteRenderer2;

	private SpriteRenderer SignSpriteRenderer3;

	private Renderer DiceRenderer;

	private List<DiceVisuals> Visuals = new List<DiceVisuals>();

	private void Start()
	{
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_0031: Unknown result type (might be due to invalid IL or missing references)
		//IL_0036: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0084: Unknown result type (might be due to invalid IL or missing references)
		//IL_0089: Unknown result type (might be due to invalid IL or missing references)
		Visuals.Add(new DiceVisuals(global::RepoDice.RepoDice.WarningExclamation, Color.yellow, Color.yellow, 40f));
		Visuals.Add(new DiceVisuals(global::RepoDice.RepoDice.WarningDeath, Color.red, Color.red, 100f));
		Visuals.Add(new DiceVisuals(global::RepoDice.RepoDice.WarningLuck, Color.green, Color.green, 300f));
		if (Misc.isGlitchOrConfig())
		{
			Visuals.Add(new DiceVisuals(global::RepoDice.RepoDice.WarningGlitch, Color.magenta, Color.magenta, 300f));
		}
		SignSpriteRenderer = ((Component)((Component)this).transform.Find("Emergency Sign")).gameObject.GetComponent<SpriteRenderer>();
		SignSpriteRenderer2 = ((Component)((Component)this).transform.Find("Emergency Sign2")).gameObject.GetComponent<SpriteRenderer>();
		DiceRenderer = ((Component)this).gameObject.GetComponent<Renderer>();
	}

	private void Update()
	{
		if (!Stop)
		{
			CurrentTimer -= Time.deltaTime;
			if (CurrentTimer <= 0f)
			{
				CurrentTimer = CycleTime;
				CycleSprite();
			}
		}
	}

	private void CycleSprite()
	{
		//IL_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
		CurrentSprite++;
		if (CurrentSprite >= Visuals.Count)
		{
			CurrentSprite = 0;
		}
		SignSpriteRenderer.sprite = Visuals[CurrentSprite].Sprite;
		SignSpriteRenderer2.sprite = Visuals[CurrentSprite].Sprite;
		DiceRenderer.material.SetColor("_Color", Visuals[CurrentSprite].ModelColor);
		DiceRenderer.material.SetColor("_EmissionColor", Visuals[CurrentSprite].EmissionColor * Visuals[CurrentSprite].Emission);
	}

	public void HideSigns()
	{
		Stop = true;
		((Renderer)((Component)SignSpriteRenderer).GetComponent<SpriteRenderer>()).enabled = false;
		((Renderer)((Component)SignSpriteRenderer2).GetComponent<SpriteRenderer>()).enabled = false;
	}
}
namespace RepoDice
{
	public class DebugMenu : MonoBehaviour
	{
		public class RightClickHandler2 : MonoBehaviour, IPointerClickHandler, IEventSystemHandler
		{
			public string effectName;

			public string category;

			public bool fromSaint = false;

			public void OnPointerClick(PointerEventData eventData)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Invalid comparison between Unknown and I4
				if ((int)eventData.button == 1)
				{
					FavoriteEffectManager.FavoriteData favoriteData = FavoriteEffectManager.LoadFavorites();
					switch (category)
					{
					case "Favorites":
						ToggleFavorite(effectName, favoriteData.Favorites);
						break;
					case "FavoriteScraps":
						ToggleFavorite(effectName, favoriteData.FavoriteScraps);
						break;
					case "FavoriteShopItems":
						ToggleFavorite(effectName, favoriteData.FavoriteShopItems);
						break;
					}
					FavoriteEffectManager.SaveFavorites(favoriteData);
					clearMainViewport();
					switch (category)
					{
					case "Favorites":
						ShowSelectMenu(fromSaint);
						break;
					case "FavoriteScraps":
						spawnScrap();
						break;
					case "FavoriteShopItems":
						spawnShopItems();
						break;
					}
				}
			}

			private void ToggleFavorite(string name, List<string> favorites)
			{
				if (favorites.Contains(name))
				{
					favorites.Remove(name);
				}
				else
				{
					favorites.Add(name);
				}
			}
		}

		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static Action<CallbackContext> <>9__19_0;

			public static UnityAction <>9__19_2;

			public static UnityAction <>9__19_3;

			public static UnityAction <>9__19_4;

			public static UnityAction <>9__19_5;

			public static UnityAction <>9__20_0;

			public static UnityAction <>9__20_1;

			public static UnityAction <>9__20_2;

			public static Func<PlayerAvatar, string> <>9__21_0;

			public static Func<IGrouping<string, PlayerAvatar>, PlayerAvatar> <>9__21_1;

			public static Func<PlayerAvatar, string> <>9__21_2;

			public static UnityAction<bool> <>9__23_0;

			public static UnityAction<bool> <>9__23_1;

			public static UnityAction <>9__23_3;

			public static Action<CallbackContext> <>9__24_0;

			public static Func<IEffect, string> <>9__29_1;

			public static UnityAction <>9__31_0;

			public static UnityAction <>9__31_1;

			public static UnityAction <>9__31_2;

			public static UnityAction <>9__31_3;

			public static UnityAction <>9__31_4;

			public static Func<EnemySetup, string> <>9__32_0;

			public static Func<IGrouping<string, EnemySetup>, EnemySetup> <>9__32_1;

			public static Func<EnemySetup, string> <>9__32_3;

			public static Func<Item, string> <>9__33_0;

			public static Func<IGrouping<string, Item>, Item> <>9__33_1;

			public static Func<Item, string> <>9__33_3;

			public static UnityAction <>9__34_1;

			public static UnityAction <>9__34_0;

			public static UnityAction <>9__34_2;

			public static Func<KeyValuePair<string, AudioClip>, string> <>9__35_0;

			public static UnityAction <>9__37_0;

			public static Func<string, string> <>9__39_1;

			internal void <showDebugMenu>b__19_0(CallbackContext ctx)
			{
				CloseSelectMenu();
			}

			internal void <showDebugMenu>b__19_2()
			{
				clearMainViewport();
				ShowSelectMenu();
			}

			internal void <showDebugMenu>b__19_3()
			{
				clearSubViewport();
				spawnFunctions();
			}

			internal void <showDebugMenu>b__19_4()
			{
				clearSubViewport();
				playerFunctions();
			}

			internal void <showDebugMenu>b__19_5()
			{
				clearSubViewport();
				specialFunctions(isSpecial());
			}

			internal void <playerFunctions>b__20_0()
			{
				clearMainViewport();
				RevivePlayer();
			}

			internal void <playerFunctions>b__20_1()
			{
				clearMainViewport();
				TeleportPlayer();
			}

			internal void <playerFunctions>b__20_2()
			{
				clearMainViewport();
				TeleportPlayer(bring: true);
			}

			internal string <TeleportPlayer>b__21_0(PlayerAvatar x)
			{
				return x.playerName;
			}

			internal PlayerAvatar <TeleportPlayer>b__21_1(IGrouping<string, PlayerAvatar> g)
			{
				return g.First();
			}

			internal string <TeleportPlayer>b__21_2(PlayerAvatar x)
			{
				return x.playerName;
			}

			internal void <setupButtons>b__23_0(bool isOn)
			{
				RepoDice.DebugMenuColorUsesPlayerColor.Value = isOn;
			}

			internal void <setupButtons>b__23_1(bool isOn)
			{
				RepoDice.DebugMenuClosesAfter.Value = !isOn;
			}

			internal void <setupButtons>b__23_3()
			{
				CloseSelectMenu(force: true);
			}

			internal void <ShowSelectEffectMenu>b__24_0(CallbackContext ctx)
			{
				CloseSelectMenu();
			}

			internal string <getOrdered>b__29_1(IEffect effect)
			{
				return effect.Name;
			}

			internal void <spawnFunctions>b__31_0()
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				clearMainViewport();
				spawnEnemy(Vector3.one);
			}

			internal void <spawnFunctions>b__31_1()
			{
				//IL_0016: Unknown result type (might be due to invalid IL or missing references)
				clearMainViewport();
				spawnEnemy(new Vector3(2.5f, 2.5f, 2.5f));
			}

			internal void <spawnFunctions>b__31_2()
			{
				//IL_0016: Unknown result type (might be due to invalid IL or missing references)
				clearMainViewport();
				spawnEnemy(new Vector3(0.5f, 0.5f, 0.5f));
			}

			internal void <spawnFunctions>b__31_3()
			{
				clearMainViewport();
				spawnScrap();
			}

			internal void <spawnFunctions>b__31_4()
			{
				clearMainViewport();
				spawnShopItems();
			}

			internal string <spawnEnemy>b__32_0(EnemySetup x)
			{
				return ((Object)x).name;
			}

			internal EnemySetup <spawnEnemy>b__32_1(IGrouping<string, EnemySetup> g)
			{
				return g.First();
			}

			internal string <spawnEnemy>b__32_3(EnemySetup e)
			{
				return ((Object)e).name;
			}

			internal string <spawnShopItems>b__33_0(Item x)
			{
				return x.itemName;
			}

			internal Item <spawnShopItems>b__33_1(IGrouping<string, Item> g)
			{
				return g.First();
			}

			internal string <spawnShopItems>b__33_3(Item s)
			{
				return s.itemName;
			}

			internal void <specialFunctions>b__34_1()
			{
				clearMainViewport();
				ShowSoundMenu();
			}

			internal void <specialFunctions>b__34_0()
			{
				clearMainViewport();
				poiTeleports();
			}

			internal void <specialFunctions>b__34_2()
			{
				clearMainViewport();
				jail();
			}

			internal string <ShowSoundMenu>b__35_0(KeyValuePair<string, AudioClip> x)
			{
				return x.Key;
			}

			internal void <poiTeleports>b__37_0()
			{
				//IL_003f: Unknown result type (might be due to invalid IL or missing references)
				//IL_005b: Unknown result type (might be due to invalid IL or missing references)
				((MonoBehaviourPun)Networker.Instance).photonView.RPC("ForceTeleportRPC", (RpcTarget)0, new object[3]
				{
					PlayerAvatar.instance.photonView.ViewID,
					((Component)LevelGenerator.Instance.LevelPathTruck).transform.position,
					((Component)LevelGenerator.Instance.LevelPathTruck).transform.rotation
				});
				CloseSelectMenu();
			}

			internal string <spawnScrap>b__39_1(string s)
			{
				return s;
			}
		}

		public static Color mainColor = new Color(13f / 85f, 0f, 27f / 85f, 1f);

		public static Color ButtonColor = new Color(0.6430231f, 0.2783019f, 1f, 1f);

		public static Color TextColor = new Color(0.9607844f, 43f / 85f, 0.9803922f, 1f);

		public static Color FavoriteTextColor = new Color(0.9607844f, 0.2058824f, 0.2803922f, 1f);

		public static Color BackgroundColor = new Color(0.6039216f, 0.2392157f, 1f, 0.2f);

		public static Color AccentColor = new Color(0.6078432f, 0.2588235f, 0.9921569f, 0.4627451f);

		public static GameObject EffectMenu = null;

		public static bool ran;

		public static List<Image> backgroundImages = new List<Image>();

		public static List<Image> accentImages = new List<Image>();

		public static List<Image> buttonImages = new List<Image>();

		public static List<TMP_Text> textElements = new List<TMP_Text>();

		public static List<Text> textElements2 = new List<Text>();

		public static Transform mainScrollContent;

		public static Transform subScrollContent;

		public static void SetupColors()
		{
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			if (!RepoDice.DebugMenuColorUsesPlayerColor.Value)
			{
				if (!ColorUtility.TryParseHtmlString(RepoDice.DebugMenuColor.Value, ref mainColor))
				{
					ColorUtility.TryParseHtmlString("#270051", ref mainColor);
				}
				BackgroundColor = mainColor;
				BackgroundColor.a = 0.46f;
			}
			else
			{
				mainColor = PlayerAvatar.instance.playerAvatarVisuals.color;
				BackgroundColor = PlayerAvatar.instance.playerAvatarVisuals.color;
				BackgroundColor.a = 0.46f;
			}
			(Color brighter, Color darker) tuple = ColorHelper.GenerateColors(mainColor);
			Color item = tuple.brighter;
			Color item2 = tuple.darker;
			ButtonColor = item;
			AccentColor = item2;
			TextColor = ColorHelper.GetReadableTextColor(mainColor);
			FavoriteTextColor = ColorHelper.GetEmphasisTextColor(mainColor);
		}

		public static void setupElements()
		{
			buttonImages.Add(RepoDice.DebugSubButtonPrefab.GetComponent<Image>());
			buttonImages.Add(RepoDice.DebugMenuButtonPrefab.GetComponent<Image>());
			textElements.Add(RepoDice.DebugSubButtonPrefab.GetComponentInChildren<TMP_Text>());
			textElements.Add(RepoDice.DebugMenuButtonPrefab.GetComponentInChildren<TMP_Text>());
			buttonImages.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/Background/Scroll View/Scrollbar Vertical")).GetComponent<Image>());
			buttonImages.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/Background/ClearButton")).GetComponent<Image>());
			backgroundImages.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/TopPart")).GetComponent<Image>());
			backgroundImages.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/Background/Image")).GetComponent<Image>());
			backgroundImages.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/Background")).GetComponent<Image>());
			accentImages.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/Background/Border")).GetComponent<Image>());
			accentImages.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/Background/Scroll View")).GetComponent<Image>());
			textElements.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/TopPart/Border/Title")).GetComponent<TMP_Text>());
			accentImages.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/TopPart/Border")).GetComponent<Image>());
			buttonImages.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/Select Effect")).GetComponent<Image>());
			textElements.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/Select Effect/Text (TMP)")).GetComponent<TMP_Text>());
			textElements.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/Background/ClearButton/Text (TMP)")).GetComponent<TMP_Text>());
			buttonImages.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/Spawn Menu")).GetComponent<Image>());
			textElements.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/Spawn Menu/Text (TMP)")).GetComponent<TMP_Text>());
			buttonImages.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/Player Functions")).GetComponent<Image>());
			textElements.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/Player Functions/Text (TMP)")).GetComponent<TMP_Text>());
			buttonImages.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/Special Functions")).GetComponent<Image>());
			textElements.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/Special Functions/Text (TMP)")).GetComponent<TMP_Text>());
			buttonImages.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/Grant Admin")).GetComponent<Image>());
			textElements.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/Grant Admin/Text (TMP)")).GetComponent<TMP_Text>());
			accentImages.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/Scroll View")).GetComponent<Image>());
			textElements2.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/KeepOpen/Label")).GetComponent<Text>());
			textElements2.Add(((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/Bald/Label")).GetComponent<Text>());
			textElements.Add(((Component)RepoDice.SelectMenuPrefab.transform.Find("DebugMenu/ColorPlayer/Label")).GetComponent<TMP_Text>());
			setupSelectElements();
			ran = true;
		}

		public static void setupSelectElements()
		{
			buttonImages.Add(((Component)RepoDice.SelectMenuPrefab.transform.Find("DebugMenu/Background/Scroll View/Scrollbar Vertical")).GetComponent<Image>());
			buttonImages.Add(((Component)RepoDice.SelectMenuPrefab.transform.Find("DebugMenu/Background/ClearButton")).GetComponent<Image>());
			backgroundImages.Add(((Component)RepoDice.SelectMenuPrefab.transform.Find("DebugMenu/TopPart")).GetComponent<Image>());
			backgroundImages.Add(((Component)RepoDice.SelectMenuPrefab.transform.Find("DebugMenu/Background/Image")).GetComponent<Image>());
			backgroundImages.Add(((Component)RepoDice.SelectMenuPrefab.transform.Find("DebugMenu/Background")).GetComponent<Image>());
			accentImages.Add(((Component)RepoDice.SelectMenuPrefab.transform.Find("DebugMenu/Background/Border")).GetComponent<Image>());
			accentImages.Add(((Component)RepoDice.SelectMenuPrefab.transform.Find("DebugMenu/Background/Scroll View")).GetComponent<Image>());
			textElements.Add(((Component)RepoDice.SelectMenuPrefab.transform.Find("DebugMenu/TopPart/Border/Title")).GetComponent<TMP_Text>());
			accentImages.Add(((Component)RepoDice.SelectMenuPrefab.transform.Find("DebugMenu/TopPart/Border")).GetComponent<Image>());
			textElements.Add(((Component)RepoDice.SelectMenuPrefab.transform.Find("DebugMenu/Background/ClearButton/Text (TMP)")).GetComponent<TMP_Text>());
			textElements2.Add(((Component)RepoDice.SelectMenuPrefab.transform.Find("DebugMenu/Bald/Label")).GetComponent<Text>());
			textElements.Add(((Component)RepoDice.SelectMenuPrefab.transform.Find("DebugMenu/KeepOpen/Label")).GetComponent<TMP_Text>());
			textElements.Add(((Component)RepoDice.SelectMenuPrefab.transform.Find("DebugMenu/ColorPlayer/Label")).GetComponent<TMP_Text>());
		}

		public static void setColors()
		{
			//IL_001a: 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_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
			ColorBlock colors = ((Selectable)((Component)RepoDice.DebugMenuPrefab.transform.Find("DebugMenu/Background/Scroll View/Scrollbar Vertical")).GetComponent<Scrollbar>()).colors;
			ColorBlock colors2 = ((Selectable)((Component)RepoDice.SelectMenuPrefab.transform.Find("DebugMenu/Background/Scroll View/Scrollbar Vertical")).GetComponent<Scrollbar>()).colors;
			((ColorBlock)(ref colors)).normalColor = TextColor;
			((ColorBlock)(ref colors)).highlightedColor = TextColor;
			((ColorBlock)(ref colors)).pressedColor = TextColor;
			((ColorBlock)(ref colors)).selectedColor = TextColor;
			((ColorBlock)(ref colors2)).normalColor = TextColor;
			((ColorBlock)(ref colors2)).highlightedColor = TextColor;
			((ColorBlock)(ref colors2)).pressedColor = TextColor;
			((ColorBlock)(ref colors2)).selectedColor = TextColor;
			foreach (Image buttonImage in buttonImages)
			{
				((Graphic)buttonImage).color = ButtonColor;
			}
			foreach (TMP_Text textElement in textElements)
			{
				((Graphic)textElement).color = TextColor;
			}
			foreach (Text item in textElements2)
			{
				((Graphic)item).color = TextColor;
			}
			foreach (Image accentImage in accentImages)
			{
				((Graphic)accentImage).color = AccentColor;
			}
			foreach (Image backgroundImage in backgroundImages)
			{
				((Graphic)backgroundImage).color = BackgroundColor;
			}
		}

		public static void showDebugMenu()
		{
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Expected O, but got Unknown
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d8: Expected O, but got Unknown
			//IL_0249: Unknown result type (might be due to invalid IL or missing references)
			//IL_024e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0254: Expected O, but got Unknown
			//IL_02ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b6: Expected O, but got Unknown
			//IL_030d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0312: Unknown result type (might be due to invalid IL or missing references)
			//IL_0318: Expected O, but got Unknown
			//IL_0354: Unknown result type (might be due to invalid IL or missing references)
			//IL_0359: Unknown result type (might be due to invalid IL or missing references)
			//IL_035f: Expected O, but got Unknown
			SetupColors();
			if (!ran)
			{
				setupElements();
			}
			if (ran)
			{
				setColors();
			}
			if ((Object)(object)EffectMenu != (Object)null)
			{
				Object.Destroy((Object)(object)EffectMenu);
				EffectMenu = null;
			}
			InputAction val = new InputAction((string)null, (InputActionType)0, "<Keyboard>/escape", (string)null, (string)null, (string)null);
			val.performed += delegate
			{
				CloseSelectMenu();
			};
			val.Enable();
			EffectMenu = Object.Instantiate<GameObject>(RepoDice.DebugMenuPrefab);
			Canvas component = EffectMenu.GetComponent<Canvas>();
			component.renderMode = (RenderMode)0;
			component.overrideSorting = true;
			component.sortingOrder = 999;
			EffectMenu.transform.localPosition = Vector3.zero;
			EffectMenu.transform.localScale = Vector3.one;
			EffectMenu.transform.localRotation = Quaternion.identity;
			if ((Object)(object)EffectMenu == (Object)null)
			{
				Debug.LogError((object)"EffectMenu is null after instantiation!");
				return;
			}
			subScrollContent = EffectMenu.transform.Find("DebugMenu/Scroll View/Viewport/Content");
			mainScrollContent = EffectMenu.transform.Find("DebugMenu/Background/Scroll View/Viewport/Content");
			TMP_InputField searchInput = ((Component)EffectMenu.transform.Find("DebugMenu/Background/SearchField")).GetComponent<TMP_InputField>();
			((UnityEvent<string>)(object)searchInput.onValueChanged).AddListener((UnityAction<string>)FilterItems);
			Button component2 = ((Component)EffectMenu.transform.Find("DebugMenu/Background/ClearButton")).GetComponent<Button>();
			((UnityEvent)component2.onClick).AddListener((UnityAction)delegate
			{
				searchInput.text = "";
			});
			DebugMenuController debugMenuController = EffectMenu.AddComponent<DebugMenuController>();
			debugMenuController.EffectMenu = EffectMenu;
			setupButtons();
			Button component3 = ((Component)EffectMenu.transform.Find("DebugMenu/Select Effect")).GetComponent<Button>();
			TMP_Text component4 = ((Component)EffectMenu.transform.Find("DebugMenu/Select Effect/Text (TMP)")).GetComponent<TMP_Text>();
			ButtonClickedEvent onClick = component3.onClick;
			object obj = <>c.<>9__19_2;
			if (obj == null)
			{
				UnityAction val2 = delegate
				{
					clearMainViewport();
					ShowSelectMenu();
				};
				<>c.<>9__19_2 = val2;
				obj = (object)val2;
			}
			((UnityEvent)onClick).AddListener((UnityAction)obj);
			Button component5 = ((Component)EffectMenu.transform.Find("DebugMenu/Spawn Menu")).GetComponent<Button>();
			TMP_Text component6 = ((Component)EffectMenu.transform.Find("DebugMenu/Spawn Menu/Text (TMP)")).GetComponent<TMP_Text>();
			ButtonClickedEvent onClick2 = component5.onClick;
			object obj2 = <>c.<>9__19_3;
			if (obj2 == null)
			{
				UnityAction val3 = delegate
				{
					clearSubViewport();
					spawnFunctions();
				};
				<>c.<>9__19_3 = val3;
				obj2 = (object)val3;
			}
			((UnityEvent)onClick2).AddListener((UnityAction)obj2);
			Button component7 = ((Component)EffectMenu.transform.Find("DebugMenu/Player Functions")).GetComponent<Button>();
			TMP_Text component8 = ((Component)EffectMenu.transform.Find("DebugMenu/Player Functions/Text (TMP)")).GetComponent<TMP_Text>();
			ButtonClickedEvent onClick3 = component7.onClick;
			object obj3 = <>c.<>9__19_4;
			if (obj3 == null)
			{
				UnityAction val4 = delegate
				{
					clearSubViewport();
					playerFunctions();
				};
				<>c.<>9__19_4 = val4;
				obj3 = (object)val4;
			}
			((UnityEvent)onClick3).AddListener((UnityAction)obj3);
			Button component9 = ((Component)EffectMenu.transform.Find("DebugMenu/Special Functions")).GetComponent<Button>();
			ButtonClickedEvent onClick4 = component9.onClick;
			object obj4 = <>c.<>9__19_5;
			if (obj4 == null)
			{
				UnityAction val5 = delegate
				{
					clearSubViewport();
					specialFunctions(isSpecial());
				};
				<>c.<>9__19_5 = val5;
				obj4 = (object)val5;
			}
			((UnityEvent)onClick4).AddListener((UnityAction)obj4);
			Button component10 = ((Component)EffectMenu.transform.Find("DebugMenu/Grant Admin")).GetComponent<Button>();
			Object.Destroy((Object)(object)((Component)component10).gameObject);
			Cursor.visible = true;
			Cursor.lockState = (CursorLockMode)0;
		}

		public static void playerFunctions()
		{
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Expected O, but got Unknown
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Expected O, but got Unknown
			Transform val = EffectMenu.transform.Find("DebugMenu/Scroll View/Viewport/Content");
			GameObject val2 = Object.Instantiate<GameObject>(RepoDice.DebugSubButtonPrefab, val);
			TMP_Text component = ((Component)val2.transform.GetChild(0)).GetComponent<TMP_Text>();
			component.text = "Revive Player";
			Button component2 = val2.GetComponent<Button>();
			ButtonClickedEvent onClick = component2.onClick;
			object obj = <>c.<>9__20_0;
			if (obj == null)
			{
				UnityAction val3 = delegate
				{
					clearMainViewport();
					RevivePlayer();
				};
				<>c.<>9__20_0 = val3;
				obj = (object)val3;
			}
			((UnityEvent)onClick).AddListener((UnityAction)obj);
			GameObject val4 = Object.Instantiate<GameObject>(RepoDice.DebugSubButtonPrefab, val);
			TMP_Text component3 = ((Component)val4.transform.GetChild(0)).GetComponent<TMP_Text>();
			component3.text = "Teleport to Player";
			Button component4 = val4.GetComponent<Button>();
			ButtonClickedEvent onClick2 = component4.onClick;
			object obj2 = <>c.<>9__20_1;
			if (obj2 == null)
			{
				UnityAction val5 = delegate
				{
					clearMainViewport();
					TeleportPlayer();
				};
				<>c.<>9__20_1 = val5;
				obj2 = (object)val5;
			}
			((UnityEvent)onClick2).AddListener((UnityAction)obj2);
			GameObject val6 = Object.Instantiate<GameObject>(RepoDice.DebugSubButtonPrefab, val);
			TMP_Text component5 = ((Component)val6.transform.GetChild(0)).GetComponent<TMP_Text>();
			component5.text = "Bring Player";
			Button component6 = val6.GetComponent<Button>();
			ButtonClickedEvent onClick3 = component6.onClick;
			object obj3 = <>c.<>9__20_2;
			if (obj3 == null)
			{
				UnityAction val7 = delegate
				{
					clearMainViewport();
					TeleportPlayer(bring: true);
				};
				<>c.<>9__20_2 = val7;
				obj3 = (object)val7;
			}
			((UnityEvent)onClick3).AddListener((UnityAction)obj3);
		}

		public static void TeleportPlayer(bool bring = false)
		{
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_0143: Expected O, but got Unknown
			Transform val = EffectMenu.transform.Find("DebugMenu/Background/Scroll View/Viewport/Content");
			List<PlayerAvatar> source = SemiFunc.PlayerGetAll();
			source = (from x in source
				group x by x.playerName into g
				select g.First() into x
				orderby x.playerName
				select x).ToList();
			foreach (PlayerAvatar player in source)
			{
				if (player.playerHealth.health < 1)
				{
					continue;
				}
				GameObject val2 = Object.Instantiate<GameObject>(RepoDice.DebugMenuButtonPrefab, val);
				TMP_Text component = ((Component)val2.transform.GetChild(0)).GetComponent<TMP_Text>();
				component.text = player.playerName ?? "";
				Button component2 = val2.GetComponent<Button>();
				((UnityEvent)component2.onClick).AddListener((UnityAction)delegate
				{
					//IL_0099: Unknown result type (might be due to invalid IL or missing references)
					//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
					//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
					//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
					//IL_004b: Unknown result type (might be due to invalid IL or missing references)
					//IL_005f: Unknown result type (might be due to invalid IL or missing references)
					//IL_0064: Unknown result type (might be due to invalid IL or missing references)
					//IL_006f: Unknown result type (might be due to invalid IL or missing references)
					CloseSelectMenu();
					PlayerAvatar instance = PlayerAvatar.instance;
					if (instance.playerHealth.health <= 0 && bring)
					{
						Networker.Instance.ForceTeleportRPC(player.photonView.ViewID, ((Component)instance).transform.position + new Vector3(0f, 1f, 0f), ((Component)instance).transform.rotation);
					}
					else
					{
						Networker.Instance.ForceTeleportRPC(instance.photonView.ViewID, ((Component)player).transform.position + new Vector3(0f, 1f, 0f), ((Component)player).transform.rotation);
					}
				});
			}
		}

		public static bool isSpecial()
		{
			if (PlayerAvatar.instance.steamID == RepoDice.slayerSteamID)
			{
				return true;
			}
			if (PlayerAvatar.instance.steamID == RepoDice.glitchSteamID)
			{
				return true;
			}
			if (PlayerAvatar.instance.steamID == RepoDice.lizzieSteamID)
			{
				return true;
			}
			return false;
		}

		public static void setupButtons(bool fromSaint = false)
		{
			//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b0: Expected O, but got Unknown
			Toggle component = ((Component)EffectMenu.transform.Find("DebugMenu/ColorPlayer")).GetComponent<Toggle>();
			component.isOn = RepoDice.DebugMenuColorUsesPlayerColor.Value;
			Toggle component2 = ((Component)EffectMenu.transform.Find("DebugMenu/KeepOpen")).GetComponent<Toggle>();
			if (fromSaint)
			{
				((Component)component2).gameObject.SetActive(false);
			}
			component2.isOn = !RepoDice.DebugMenuClosesAfter.Value;
			((UnityEvent<bool>)(object)component.onValueChanged).AddListener((UnityAction<bool>)delegate(bool isOn)
			{
				RepoDice.DebugMenuColorUsesPlayerColor.Value = isOn;
			});
			if (((Component)component2).gameObject.activeInHierarchy)
			{
				((UnityEvent<bool>)(object)component2.onValueChanged).AddListener((UnityAction<bool>)delegate(bool isOn)
				{
					RepoDice.DebugMenuClosesAfter.Value = !isOn;
				});
			}
			Toggle component3 = ((Component)EffectMenu.transform.Find("DebugMenu/Bald")).GetComponent<Toggle>();
			component3.isOn = RepoDice.Bald.Value;
			GameObject BaldImage = ((Component)EffectMenu.transform.Find("DebugMenu/Background/Image")).gameObject;
			((UnityEvent<bool>)(object)component3.onValueChanged).AddListener((UnityAction<bool>)delegate(bool isOn)
			{
				RepoDice.Bald.Value = isOn;
				BaldImage.SetActive(isOn);
			});
			if (RepoDice.Bald.Value)
			{
				BaldImage.SetActive(true);
			}
			else
			{
				BaldImage.SetActive(false);
			}
			Button component4 = ((Component)EffectMenu.transform.Find("DebugMenu/CloseButton")).GetComponent<Button>();
			ButtonClickedEvent onClick = component4.onClick;
			object obj = <>c.<>9__23_3;
			if (obj == null)
			{
				UnityAction val = delegate
				{
					CloseSelectMenu(force: true);
				};
				<>c.<>9__23_3 = val;
				obj = (object)val;
			}
			((UnityEvent)onClick).AddListener((UnityAction)obj);
		}

		public static void ShowSelectEffectMenu(bool fromSaint = false)
		{
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: Expected O, but got Unknown
			//IL_0195: Unknown result type (might be due to invalid IL or missing references)
			//IL_019f: Expected O, but got Unknown
			SetupColors();
			if (!ran)
			{
				setupElements();
			}
			if (ran)
			{
				setColors();
			}
			if ((Object)(object)EffectMenu != (Object)null)
			{
				Object.Destroy((Object)(object)EffectMenu);
				EffectMenu = null;
			}
			EffectMenu = Object.Instantiate<GameObject>(RepoDice.SelectMenuPrefab, (Transform)null, false);
			Canvas component = EffectMenu.GetComponent<Canvas>();
			component.renderMode = (RenderMode)0;
			component.overrideSorting = true;
			component.sortingOrder = 999;
			EffectMenu.transform.localPosition = Vector3.zero;
			EffectMenu.transform.localScale = Vector3.one;
			EffectMenu.transform.localRotation = Quaternion.identity;
			mainScrollContent = EffectMenu.transform.Find("DebugMenu/Background/Scroll View/Viewport/Content");
			InputAction val = new InputAction((string)null, (InputActionType)0, "<Keyboard>/escape", (string)null, (string)null, (string)null);
			val.performed += delegate
			{
				CloseSelectMenu();
			};
			val.Enable();
			TMP_InputField searchInput = ((Component)EffectMenu.transform.Find("DebugMenu/Background/SearchField")).GetComponent<TMP_InputField>();
			((UnityEvent<string>)(object)searchInput.onValueChanged).AddListener((UnityAction<string>)FilterItems);
			Button component2 = ((Component)EffectMenu.transform.Find("DebugMenu/Background/ClearButton")).GetComponent<Button>();
			((UnityEvent)component2.onClick).AddListener((UnityAction)delegate
			{
				searchInput.text = "";
			});
			if ((Object)(object)EffectMenu == (Object)null)
			{
				Debug.LogError((object)"EffectMenu is null after instantiation!");
				return;
			}
			DebugMenuController debugMenuController = EffectMenu.AddComponent<DebugMenuController>();
			debugMenuController.EffectMenu = EffectMenu;
			setupButtons(fromSaint);
			Cursor.visible = true;
			Cursor.lockState = (CursorLockMode)0;
			ShowSelectMenu(fromSaint);
		}

		public static void CloseSelectMenu(bool force = false)
		{
			if ((RepoDice.DebugMenuClosesAfter.Value || force) && (Object)(object)EffectMenu != (Object)null)
			{
				Cursor.visible = false;
				Cursor.lockState = (CursorLockMode)1;
				Object.Destroy((Object)(object)EffectMenu);
			}
		}

		private static void FilterItems(string searchText)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			Transform val = EffectMenu.transform.Find("DebugMenu/Background/Scroll View/Viewport/Content");
			foreach (Transform item in val)
			{
				Transform val2 = item;
				TextMeshProUGUI componentInChildren = ((Component)val2).GetComponentInChildren<TextMeshProUGUI>();
				if (Object.op_Implicit((Object)(object)componentInChildren))
				{
					bool active = string.IsNullOrEmpty(searchText) || ((TMP_Text)componentInChildren).text.ToLower().Contains(searchText.ToLower());
					((Component)val2).gameObject.SetActive(active);
				}
			}
		}

		public static void clearMainViewport()
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			Transform val = EffectMenu.transform.Find("DebugMenu/Background/Scroll View/Viewport/Content");
			foreach (Transform item in val)
			{
				Transform val2 = item;
				Object.Destroy((Object)(object)((Component)val2).gameObject);
			}
		}

		public static void clearSubViewport()
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			Transform val = EffectMenu.transform.Find("DebugMenu/Scroll View/Viewport/Content");
			foreach (Transform item in val)
			{
				Transform val2 = item;
				Object.Destroy((Object)(object)((Component)val2).gameObject);
			}
		}

		public static List<IEffect> getOrdered()
		{
			List<IEffect> source = new List<IEffect>(DieBehaviour.AllowedEffects);
			if (Misc.GetLocalPlayer().steamID == RepoDice.slayerSteamID)
			{
				source = new List<IEffect>(DieBehaviour.AllEffects);
			}
			FavoriteEffectManager.FavoriteData favoriteData = FavoriteEffectManager.LoadFavorites();
			List<string> favoriteEffectNames = favoriteData.Favorites;
			return source.OrderByDescending((IEffect effect) => favoriteEffectNames.Contains(effect.Name)).ThenBy<IEffect, string>((IEffect effect) => effect.Name, StringComparer.OrdinalIgnoreCase).ToList();
		}

		public static void ShowSelectMenu(bool fromSaint = false)
		{
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0163: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Expected O, but got Unknown
			Transform val = EffectMenu.transform.Find("DebugMenu/Background/Scroll View/Viewport/Content");
			List<IEffect> ordered = getOrdered();
			FavoriteEffectManager.FavoriteData favoriteData = FavoriteEffectManager.LoadFavorites();
			List<string> favorites = favoriteData.Favorites;
			foreach (IEffect effect in ordered)
			{
				GameObject val2 = Object.Instantiate<GameObject>(RepoDice.DebugMenuButtonPrefab, val);
				TMP_Text component = ((Component)val2.transform.GetChild(0)).GetComponent<TMP_Text>();
				bool flag = favorites.Contains(effect.Name);
				string text = (flag ? "*" : "");
				component.text = $"{text} {effect.Name} [{effect.Outcome}] {text}";
				((Graphic)component).color = (flag ? FavoriteTextColor : TextColor);
				component.outlineWidth = 1f;
				if (component.text.Length > 20)
				{
					component.fontSize = 12f;
				}
				else
				{
					component.fontSize = 16f;
				}
				Button component2 = val2.GetComponent<Button>();
				((UnityEvent)component2.onClick).AddListener((UnityAction)delegate
				{
					CloseSelectMenu(fromSaint);
					if (SemiFunc.IsMasterClientOrSingleplayer())
					{
						Networker.Instance.SelectEffectMenuRPC(fromSaint, PlayerAvatar.instance.photonView.ViewID, effect.Name);
					}
					else
					{
						((MonoBehaviourPun)Networker.Instance).photonView.RPC("SelectEffectMenuRPC", (RpcTarget)2, new object[3]
						{
							fromSaint,
							PlayerAvatar.instance.photonView.ViewID,
							effect.Name
						});
					}
					bool flag2 = false;
					string text2 = "";
				});
				RightClickHandler2 rightClickHandler = val2.AddComponent<RightClickHandler2>();
				rightClickHandler.effectName = effect.Name;
				rightClickHandler.category = "Favorites";
				rightClickHandler.fromSaint = fromSaint;
			}
		}

		public static void spawnFunctions()
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Expected O, but got Unknown
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Expected O, but got Unknown
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Expected O, but got Unknown
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_0187: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: Expected O, but got Unknown
			//IL_01e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f4: Expected O, but got Unknown
			GameObject val = Object.Instantiate<GameObject>(RepoDice.DebugSubButtonPrefab, subScrollContent);
			TMP_Text component = ((Component)val.transform.GetChild(0)).GetComponent<TMP_Text>();
			component.text = "Spawn Enemy";
			Button component2 = val.GetComponent<Button>();
			ButtonClickedEvent onClick = component2.onClick;
			object obj = <>c.<>9__31_0;
			if (obj == null)
			{
				UnityAction val2 = delegate
				{
					//IL_0007: Unknown result type (might be due to invalid IL or missing references)
					clearMainViewport();
					spawnEnemy(Vector3.one);
				};
				<>c.<>9__31_0 = val2;
				obj = (object)val2;
			}
			((UnityEvent)onClick).AddListener((UnityAction)obj);
			GameObject val3 = Object.Instantiate<GameObject>(RepoDice.DebugSubButtonPrefab, subScrollContent);
			TMP_Text component3 = ((Component)val3.transform.GetChild(0)).GetComponent<TMP_Text>();
			component3.text = "Spawn BIG Enemy";
			Button component4 = val3.GetComponent<Button>();
			ButtonClickedEvent onClick2 = component4.onClick;
			object obj2 = <>c.<>9__31_1;
			if (obj2 == null)
			{
				UnityAction val4 = delegate
				{
					//IL_0016: Unknown result type (might be due to invalid IL or missing references)
					clearMainViewport();
					spawnEnemy(new Vector3(2.5f, 2.5f, 2.5f));
				};
				<>c.<>9__31_1 = val4;
				obj2 = (object)val4;
			}
			((UnityEvent)onClick2).AddListener((UnityAction)obj2);
			GameObject val5 = Object.Instantiate<GameObject>(RepoDice.DebugSubButtonPrefab, subScrollContent);
			TMP_Text component5 = ((Component)val5.transform.GetChild(0)).GetComponent<TMP_Text>();
			component5.text = "Spawn SMOL Enemy";
			Button component6 = val5.GetComponent<Button>();
			ButtonClickedEvent onClick3 = component6.onClick;
			object obj3 = <>c.<>9__31_2;
			if (obj3 == null)
			{
				UnityAction val6 = delegate
				{
					//IL_0016: Unknown result type (might be due to invalid IL or missing references)
					clearMainViewport();
					spawnEnemy(new Vector3(0.5f, 0.5f, 0.5f));
				};
				<>c.<>9__31_2 = val6;
				obj3 = (object)val6;
			}
			((UnityEvent)onClick3).AddListener((UnityAction)obj3);
			GameObject val7 = Object.Instantiate<GameObject>(RepoDice.DebugSubButtonPrefab, subScrollContent);
			TMP_Text component7 = ((Component)val7.transform.GetChild(0)).GetComponent<TMP_Text>();
			component7.text = "Spawn Valuable";
			Button component8 = val7.GetComponent<Button>();
			ButtonClickedEvent onClick4 = component8.onClick;
			object obj4 = <>c.<>9__31_3;
			if (obj4 == null)
			{
				UnityAction val8 = delegate
				{
					clearMainViewport();
					spawnScrap();
				};
				<>c.<>9__31_3 = val8;
				obj4 = (object)val8;
			}
			((UnityEvent)onClick4).AddListener((UnityAction)obj4);
			GameObject val9 = Object.Instantiate<GameObject>(RepoDice.DebugSubButtonPrefab, subScrollContent);
			TMP_Text component9 = ((Component)val9.transform.GetChild(0)).GetComponent<TMP_Text>();
			component9.text = "Spawn Shop Items";
			Button component10 = val9.GetComponent<Button>();
			ButtonClickedEvent onClick5 = component10.onClick;
			object obj5 = <>c.<>9__31_4;
			if (obj5 == null)
			{
				UnityAction val10 = delegate
				{
					clearMainViewport();
					spawnShopItems();
				};
				<>c.<>9__31_4 = val10;
				obj5 = (object)val10;
			}
			((UnityEvent)onClick5).AddListener((UnityAction)obj5);
		}

		public static void spawnEnemy(Vector3 size)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0179: Unknown result type (might be due to invalid IL or missing references)
			//IL_0183: Expected O, but got Unknown
			FavoriteEffectManager.FavoriteData favoriteData = FavoriteEffectManager.LoadFavorites();
			List<string> favoriteEnemyNames = favoriteData.FavoriteEnemies;
			List<EnemySetup> list = (from x in Misc.getEnemies()
				group x by ((Object)x).name into g
				select g.First() into e
				orderby (!favoriteEnemyNames.Contains(((Object)e).name)) ? 1 : 0, ((Object)e).name
				select e).ToList();
			foreach (EnemySetup enemy in list)
			{
				GameObject val = Object.Instantiate<GameObject>(RepoDice.DebugMenuButtonPrefab, mainScrollContent);
				TMP_Text component = ((Component)val.transform.GetChild(0)).GetComponent<TMP_Text>();
				bool flag = favoriteEnemyNames.Contains(((Object)enemy).name);
				string text = (flag ? "*" : "");
				component.text = text + " " + ((Object)enemy).name;
				((Graphic)component).color = (flag ? FavoriteTextColor : TextColor);
				Button component2 = val.GetComponent<Button>();
				((UnityEvent)component2.onClick).AddListener((UnityAction)delegate
				{
					//IL_0012: Unknown result type (might be due to invalid IL or missing references)
					//IL_0021: Unknown result type (might be due to invalid IL or missing references)
					//IL_0026: Unknown result type (might be due to invalid IL or missing references)
					//IL_002b: Unknown result type (might be due to invalid IL or missing references)
					//IL_005b: Unknown result type (might be due to invalid IL or missing references)
					//IL_006a: Unknown result type (might be due to invalid IL or missing references)
					CloseSelectMenu();
					Vector3 val2 = ((Component)PlayerAvatar.instance).transform.position + ((Component)PlayerAvatar.instance).transform.forward;
					((MonoBehaviourPun)Networker.Instance).photonView.RPC("SpawnAndScaleEnemy", (RpcTarget)2, new object[5]
					{
						((Object)enemy).name,
						1,
						val2,
						size,
						false
					});
				});
				RightClickHandler2 rightClickHandler = val.AddComponent<RightClickHandler2>();
				rightClickHandler.effectName = ((Object)enemy).name;
				rightClickHandler.category = "FavoriteEnemies";
			}
		}

		public static void spawnShopItems()
		{
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0184: Expected O, but got Unknown
			FavoriteEffectManager.FavoriteData favoriteData = FavoriteEffectManager.LoadFavorites();
			List<string> favoriteShopItemNames = favoriteData.FavoriteShopItems;
			List<Item> source = (from x in StatsManager.instance.itemDictionary.Values.ToList()
				group x by x.itemName into g
				select g.First()).ToList();
			source = (from s in source
				orderby (!favoriteShopItemNames.Contains(s.itemName)) ? 1 : 0, s.itemName
				select s).ToList();
			foreach (Item item in source)
			{
				GameObject val = Object.Instantiate<GameObject>(RepoDice.DebugMenuButtonPrefab, mainScrollContent);
				TMP_Text component = ((Component)val.transform.GetChild(0)).GetComponent<TMP_Text>();
				bool flag = favoriteShopItemNames.Contains(item.itemName);
				string text = (flag ? "*" : "");
				component.text = text + " " + item.itemName;
				((Graphic)component).color = (flag ? FavoriteTextColor : TextColor);
				Button component2 = val.GetComponent<Button>();
				((UnityEvent)component2.onClick).AddListener((UnityAction)delegate
				{
					//IL_0012: Unknown result type (might be due to invalid IL or missing references)
					//IL_0021: Unknown result type (might be due to invalid IL or missing references)
					//IL_0026: Unknown result type (might be due to invalid IL or missing references)
					//IL_002b: Unknown result type (might be due to invalid IL or missing references)
					//IL_0052: Unknown result type (might be due to invalid IL or missing references)
					CloseSelectMenu();
					Vector3 val2 = ((Component)PlayerAvatar.instance).transform.position + ((Component)PlayerAvatar.instance).transform.forward;
					((MonoBehaviourPun)Networker.Instance).photonView.RPC("spawnItemRPC", (RpcTarget)2, new object[3]
					{
						item.itemName,
						val2,
						RepoDice.keepItems.Value
					});
				});
				RightClickHandler2 rightClickHandler = val.AddComponent<RightClickHandler2>();
				rightClickHandler.effectName = item.itemName;
				rightClickHandler.category = "FavoriteShopItems";
			}
		}

		public static void specialFunctions(bool special)
		{
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Expected O, but got Unknown
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Expected O, but got Unknown
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Expected O, but got Unknown
			if (special)
			{
				GameObject val = Object.Instantiate<GameObject>(RepoDice.DebugSubButtonPrefab, subScrollContent);
				TMP_Text component = ((Component)val.transform.GetChild(0)).GetComponent<TMP_Text>();
				component.text = "Play Sound";
				Button component2 = val.GetComponent<Button>();
				ButtonClickedEvent onClick = component2.onClick;
				object obj = <>c.<>9__34_1;
				if (obj == null)
				{
					UnityAction val2 = delegate
					{
						clearMainViewport();
						ShowSoundMenu();
					};
					<>c.<>9__34_1 = val2;
					obj = (object)val2;
				}
				((UnityEvent)onClick).AddListener((UnityAction)obj);
			}
			GameObject val3 = Object.Instantiate<GameObject>(RepoDice.DebugSubButtonPrefab, subScrollContent);
			TMP_Text component3 = ((Component)val3.transform.GetChild(0)).GetComponent<TMP_Text>();
			component3.text = "POI Teleports";
			Button component4 = val3.GetComponent<Button>();
			ButtonClickedEvent onClick2 = component4.onClick;
			object obj2 = <>c.<>9__34_0;
			if (obj2 == null)
			{
				UnityAction val4 = delegate
				{
					clearMainViewport();
					poiTeleports();
				};
				<>c.<>9__34_0 = val4;
				obj2 = (object)val4;
			}
			((UnityEvent)onClick2).AddListener((UnityAction)obj2);
			if (!special)
			{
				return;
			}
			GameObject val5 = Object.Instantiate<GameObject>(RepoDice.DebugSubButtonPrefab, subScrollContent);
			TMP_Text component5 = ((Component)val5.transform.GetChild(0)).GetComponent<TMP_Text>();
			component5.text = "Jail";
			Button component6 = val5.GetComponent<Button>();
			ButtonClickedEvent onClick3 = component6.onClick;
			object obj3 = <>c.<>9__34_2;
			if (obj3 == null)
			{
				UnityAction val6 = delegate
				{
					clearMainViewport();
					jail();
				};
				<>c.<>9__34_2 = val6;
				obj3 = (object)val6;
			}
			((UnityEvent)onClick3).AddListener((UnityAction)obj3);
		}

		public static void ShowSoundMenu()
		{
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Expected O, but got Unknown
			Transform val = EffectMenu.transform.Find("DebugMenu/Background/Scroll View/Viewport/Content");
			foreach (KeyValuePair<string, AudioClip> entry in RepoDice.sounds.OrderBy<KeyValuePair<string, AudioClip>, string>((KeyValuePair<string, AudioClip> x) => x.Key))
			{
				GameObject val2 = Object.Instantiate<GameObject>(RepoDice.DebugMenuButtonPrefab, val);
				TMP_Text component = ((Component)val2.transform.GetChild(0)).GetComponent<TMP_Text>();
				component.text = entry.Key;
				component.outlineWidth = 1f;
				if (component.text.Length > 20)
				{
					component.fontSize = 12f;
				}
				else
				{
					component.fontSize = 16f;
				}
				Button component2 = val2.GetComponent<Button>();
				((UnityEvent)component2.onClick).AddListener((UnityAction)delegate
				{
					CloseSelectMenu();
					((MonoBehaviourPun)Networker.Instance).photonView.RPC("playSoundForEveryone", (RpcTarget)0, new object[1] { entry.Key });
				});
			}
		}

		public static void RevivePlayer()
		{
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Expected O, but got Unknown
			Transform val = EffectMenu.transform.Find("DebugMenu/Background/Scroll View/Viewport/Content");
			Cursor.visible = true;
			Cursor.lockState = (CursorLockMode)0;
			List<PlayerAvatar> list = SemiFunc.PlayerGetAll();
			int num = 0;
			foreach (PlayerAvatar player in list)
			{
				if (player.playerHealth.health <= 0)
				{
					num++;
					GameObject val2 = Object.Instantiate<GameObject>(RepoDice.DebugMenuButtonPrefab, val);
					TMP_Text component = ((Component)val2.transform.GetChild(0)).GetComponent<TMP_Text>();
					component.text = player.playerName ?? "";
					Button component2 = val2.GetComponent<Button>();
					((UnityEvent)component2.onClick).AddListener((UnityAction)delegate
					{
						clearMainViewport();
						CloseSelectMenu();
						RevivePlayer();
						((MonoBehaviourPun)Networker.Instance).photonView.RPC("reviveRPC", (RpcTarget)0, new object[1] { player.photonView.ViewID });
					});
				}
			}
			if (num == 0)
			{
				GameObject val3 = Object.Instantiate<GameObject>(RepoDice.DebugMenuButtonPrefab, val);
				TMP_Text component3 = ((Component)val3.transform.GetChild(0)).GetComponent<TMP_Text>();
				component3.text = "No Dead Players";
			}
		}

		public static void poiTeleports()
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Expected O, but got Unknown
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Expected O, but got Unknown
			//IL_0167: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Expected O, but got Unknown
			GameObject val = Object.Instantiate<GameObject>(RepoDice.DebugMenuButtonPrefab, mainScrollContent);
			TMP_Text component = ((Component)val.transform.GetChild(0)).GetComponent<TMP_Text>();
			component.text = "Ship";
			Button component2 = val.GetComponent<Button>();
			ButtonClickedEvent onClick = component2.onClick;
			object obj = <>c.<>9__37_0;
			if (obj == null)
			{
				UnityAction val2 = delegate
				{
					//IL_003f: Unknown result type (might be due to invalid IL or missing references)
					//IL_005b: Unknown result type (might be due to invalid IL or missing references)
					((MonoBehaviourPun)Networker.Instance).photonView.RPC("ForceTeleportRPC", (RpcTarget)0, new object[3]
					{
						PlayerAvatar.instance.photonView.ViewID,
						((Component)LevelGenerator.Instance.LevelPathTruck).transform.position,
						((Component)LevelGenerator.Instance.LevelPathTruck).transform.rotation
					});
					CloseSelectMenu();
				};
				<>c.<>9__37_0 = val2;
				obj = (object)val2;
			}
			((UnityEvent)onClick).AddListener((UnityAction)obj);
			ExtractionPoint[] array = Object.FindObjectsByType<ExtractionPoint>((FindObjectsSortMode)0);
			ExtractionPoint[] array2 = array;
			foreach (ExtractionPoint entrance in array2)
			{
				GameObject val3 = Object.Instantiate<GameObject>(RepoDice.DebugMenuButtonPrefab, mainScrollContent);
				TMP_Text component3 = ((Component)val3.transform.GetChild(0)).GetComponent<TMP_Text>();
				component3.text = ((Object)entrance).name;
				Button component4 = val3.GetComponent<Button>();
				((UnityEvent)component4.onClick).AddListener((UnityAction)delegate
				{
					//IL_003b: Unknown result type (might be due to invalid IL or missing references)
					//IL_0053: Unknown result type (might be due to invalid IL or missing references)
					((MonoBehaviourPun)Networker.Instance).photonView.RPC("ForceTeleportRPC", (RpcTarget)0, new object[3]
					{
						PlayerAvatar.instance.photonView.ViewID,
						((Component)entrance).transform.position,
						((Component)entrance).transform.rotation
					});
					CloseSelectMenu();
				});
			}
			LevelPoint[] array3 = Object.FindObjectsByType<LevelPoint>((FindObjectsSortMode)0);
			LevelPoint[] array4 = array3;
			foreach (LevelPoint levelPoint in array4)
			{
				GameObject val4 = Object.Instantiate<GameObject>(RepoDice.DebugMenuButtonPrefab, mainScrollContent);
				TMP_Text component5 = ((Component)val4.transform.GetChild(0)).GetComponent<TMP_Text>();
				component5.text = ((Object)levelPoint).name;
				Button component6 = val4.GetComponent<Button>();
				((UnityEvent)component6.onClick).AddListener((UnityAction)delegate
				{
					//IL_003b: Unknown result type (might be due to invalid IL or missing references)
					//IL_0053: Unknown result type (might be due to invalid IL or missing references)
					((MonoBehaviourPun)Networker.Instance).photonView.RPC("ForceTeleportRPC", (RpcTarget)0, new object[3]
					{
						PlayerAvatar.instance.photonView.ViewID,
						((Component)levelPoint).transform.position,
						((Component)levelPoint).transform.rotation
					});
					CloseSelectMenu();
				});
			}
		}

		public static void jail()
		{
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Expected O, but got Unknown
			List<PlayerAvatar> list = SemiFunc.PlayerGetAll();
			GameObject val = GameObject.Find("Shop Door");
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			LevelPoint lp = ((Component)val.transform.parent).GetComponentInChildren<LevelPoint>();
			foreach (PlayerAvatar player in list)
			{
				GameObject val2 = Object.Instantiate<GameObject>(RepoDice.DebugMenuButtonPrefab, mainScrollContent);
				TMP_Text component = ((Component)val2.transform.GetChild(0)).GetComponent<TMP_Text>();
				component.text = player.playerName;
				Button component2 = val2.GetComponent<Button>();
				((UnityEvent)component2.onClick).AddListener((UnityAction)delegate
				{
					//IL_0041: Unknown result type (might be due to invalid IL or missing references)
					//IL_005e: Unknown result type (might be due to invalid IL or missing references)
					((MonoBehaviourPun)Networker.Instance).photonView.RPC("ForceTeleportRPC", (RpcTarget)0, new object[3]
					{
						player.photonView.ViewID,
						((Component)lp).transform.position,
						((Component)lp).transform.rotation
					});
					CloseSelectMenu();
				});
			}
		}

		public static void spawnScrap()
		{
			//IL_012a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Expected O, but got Unknown
			FavoriteEffectManager.FavoriteData favoriteData = FavoriteEffectManager.LoadFavorites();
			List<string> favoriteScrapNames = favoriteData.FavoriteScraps;
			if (Misc.valuablePrefabsByName.Count == 0)
			{
				Misc.CacheValuables();
			}
			List<string> list = Misc.valuablePrefabsByName.Keys.ToList();
			RepoDice.SuperLog(list.Count.ToString(), (LogLevel)16);
			list = (from s in list
				orderby (!favoriteScrapNames.Contains(s)) ? 1 : 0, s
				select s).ToList();
			foreach (string scrap in list)
			{
				GameObject val = Object.Instantiate<GameObject>(RepoDice.DebugMenuButtonPrefab, mainScrollContent);
				TMP_Text component = ((Component)val.transform.GetChild(0)).GetComponent<TMP_Text>();
				bool flag = favoriteScrapNames.Contains(scrap);
				string text = (flag ? "*" : "");
				component.text = text + " " + scrap;
				((Graphic)component).color = (flag ? FavoriteTextColor : TextColor);
				Button component2 = val.GetComponent<Button>();
				((UnityEvent)component2.onClick).AddListener((UnityAction)delegate
				{
					//IL_0012: Unknown result type (might be due to invalid IL or missing references)
					//IL_0021: Unknown result type (might be due to invalid IL or missing references)
					//IL_0026: Unknown result type (might be due to invalid IL or missing references)
					//IL_002b: Unknown result type (might be due to invalid IL or missing references)
					//IL_004d: Unknown result type (might be due to invalid IL or missing references)
					CloseSelectMenu();
					Vector3 val2 = ((Component)PlayerAvatar.instance).transform.position + ((Component)PlayerAvatar.instance).transform.forward;
					((MonoBehaviourPun)Networker.Instance).photonView.RPC("spawnValuable", (RpcTarget)2, new object[2] { scrap, val2 });
				});
				RightClickHandler2 rightClickHandler = val.AddComponent<RightClickHandler2>();
				rightClickHandler.effectName = scrap;
				rightClickHandler.category = "FavoriteScraps";
			}
		}
	}
	public static class FavoriteEffectManager
	{
		public class FavoriteData
		{
			public List<string> Favorites { get; set; } = new List<string>();


			public List<string> FavoriteEnemies { get; set; } = new List<string>();


			public List<string> FavoriteTraps { get; set; } = new List<string>();


			public List<string> FavoriteScraps { get; set; } = new List<string>();


			public List<string> FavoriteShopItems { get; set; } = new List<string>();


			public List<string> FavoriteItems { get; set; } = new List<string>();

		}

		private static readonly string directoryPath = Path.Combine(Application.persistentDataPath, "EmergencyDice");

		private static readonly string filePath = Path.Combine(directoryPath, "Favorites.json");

		public static FavoriteData LoadFavorites()
		{
			if (!Directory.Exists(directoryPath))
			{
				Directory.CreateDirectory(directoryPath);
			}
			if (!File.Exists(filePath))
			{
				Debug.LogWarning((object)("Favorites file not found at " + filePath + ". Returning empty data."));
				return new FavoriteData();
			}
			try
			{
				string text = File.ReadAllText(filePath);
				return JsonConvert.DeserializeObject<FavoriteData>(text) ?? new FavoriteData();
			}
			catch
			{
				Debug.LogError((object)("Failed to load favorites from " + filePath + ". Returning empty data."));
				return new FavoriteData();
			}
		}

		public static void SaveFavorites(FavoriteData favorites)
		{
			if (!Directory.Exists(directoryPath))
			{
				Directory.CreateDirectory(directoryPath);
			}
			try
			{
				string contents = JsonConvert.SerializeObject((object)favorites, (Formatting)1);
				File.WriteAllText(filePath, contents);
				Debug.Log((object)("Favorites successfully saved to " + filePath));
			}
			catch (Exception ex)
			{
				Debug.LogError((object)("Failed to save favorites to " + filePath + ". Error: " + ex.Message));
			}
		}
	}
	public class DebugMenuController : MonoBehaviour
	{
		public GameObject EffectMenu;

		private InputAction escAction;

		private void Awake()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			escAction = new InputAction((string)null, (InputActionType)0, "<Keyboard>/escape", (string)null, (string)null, (string)null);
			escAction.performed += delegate
			{
				CloseMenu();
			};
			escAction.Enable();
		}

		private void OnDestroy()
		{
			escAction.Disable();
		}

		public void CloseMenu()
		{
			if ((Object)(object)EffectMenu != (Object)null)
			{
				Object.Destroy((Object)(object)EffectMenu);
				EffectMenu = null;
				Cursor.visible = false;
				Cursor.lockState = (CursorLockMode)1;
			}
		}
	}
	public class ColorHelper
	{
		public static string AppendTransparency(string hexColor, int percentage)
		{
			string text = ((int)Math.Round((double)percentage / 100.0 * 255.0)).ToString("X2");
			return hexColor + text;
		}

		public static (Color brighter, Color darker) GenerateColors(Color primary)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			float num = default(float);
			float num2 = default(float);
			float num3 = default(float);
			Color.RGBToHSV(primary, ref num, ref num2, ref num3);
			float num4 = Mathf.Clamp01(num3 + 0.3f);
			float num5 = Mathf.Clamp01(num3 * 0.5f);
			Color item = Color.HSVToRGB(num, num2, num4);
			Color item2 = Color.HSVToRGB(num, num2, num5);
			return (item, item2);
		}

		public static Color HexToColor(string hex)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			Color result = default(Color);
			if (ColorUtility.TryParseHtmlString(hex, ref result))
			{
				return result;
			}
			throw new Exception("Invalid hex color");
		}

		public static string ColorToHex(Color color)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			return "#" + ColorUtility.ToHtmlStringRGB(color);
		}

		public static Color GetEmphasisTextColor(Color background)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			float num = default(float);
			float num2 = default(float);
			float num3 = default(float);
			Color.RGBToHSV(background, ref num, ref num2, ref num3);
			num = (num + 0.5f) % 1f;
			num2 = Mathf.Clamp01(num2 + 0.3f);
			num3 = ((num3 < 0.6f) ? 0.8f : Mathf.Clamp01(1f - num3 * 0.5f));
			return Color.HSVToRGB(num, num2, num3);
		}

		public static Color GetReadableTextColor(Color background)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: 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_0024: Unknown result type (might be due to invalid IL or missing references)
			float luminance = GetLuminance(background);
			return (luminance > 0.5f) ? HexToColor("#1a1100") : Color.white;
		}

		public static float GetLuminance(Color color)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			float num = Linearize(color.r);
			float num2 = Linearize(color.g);
			float num3 = Linearize(color.b);
			return 0.2126f * num + 0.7152f * num2 + 0.0722f * num3;
		}

		private static float Linearize(float channel)
		{
			return (channel <= 0.03928f) ? (channel / 12.92f) : Mathf.Pow((channel + 0.055f) / 1.055f, 2.4f);
		}
	}
	public class Misc : MonoBehaviour
	{
		public enum Size
		{
			tiny,
			small,
			medium,
			big,
			wide,
			tall,
			veryTall
		}

		public enum UpgradeType
		{
			health,
			energy,
			strength,
			jumps,
			speed,
			range
		}

		public static readonly Dictionary<Size, List<GameObject>> valuablePrefabsBySize = new Dictionary<Size, List<GameObject>>();

		public static readonly Dictionary<string, GameObject> valuablePrefabsByName = new Dictionary<string, GameObject>();

		private static List<EnemySetup> cachedEnemies = new List<EnemySetup>();

		public static T GetRandomEnum<T>() where T : Enum
		{
			Array values = Enum.GetValues(typeof(T));
			return (T)values.GetValue(Random.Range(0, values.Length));
		}

		public static void CacheValuables()
		{
			valuablePrefabsBySize.Clear();
			valuablePrefabsByName.Clear();
			if ((Object)(object)RunManager.instance == (Object)null)
			{
				RepoDice.Logger.LogError((object)"Failed to cache LevelValuables. RunManager instance is null.");
				return;
			}
			foreach (Level level in RunManager.instance.levels)
			{
				foreach (LevelValuables valuablePreset in level.ValuablePresets)
				{
					try
					{
						Dictionary<Size, List<GameObject>> dictionary = new Dictionary<Size, List<GameObject>>
						{
							{
								Size.tiny,
								valuablePreset.tiny
							},
							{
								Size.small,
								valuablePreset.small
							},
							{
								Size.medium,
								valuablePreset.medium
							},
							{
								Size.big,
								valuablePreset.big
							},
							{
								Size.wide,
								valuablePreset.wide
							},
							{
								Size.tall,
								valuablePreset.tall
							},
							{
								Size.veryTall,
								valuablePreset.veryTall
							}
						};
						foreach (KeyValuePair<Size, List<GameObject>> item in dictionary)
						{
							if (!valuablePrefabsBySize.TryGetValue(item.Key, out List<GameObject> value))
							{
								value = new List<GameObject>();
								valuablePrefabsBySize[item.Key] = value;
							}
							foreach (GameObject item2 in item.Value)
							{
								if ((Object)(object)item2 != (Object)null)
								{
									RepoDice.SuperLog("Found Valuable Preset: " + ((Object)item2).name, (LogLevel)16);
									if (!value.Contains(item2))
									{
										value.Add(item2);
									}
									string key = ((Object)item2).name.ToLower();
									if (!valuablePrefabsByName.ContainsKey(key))
									{
										valuablePrefabsByName[key] = item2;
									}
								}
							}
						}
					}
					catch (Exception ex)
					{
						RepoDice.Logger.LogWarning((object)("Exception while caching valuables: " + ex.Message));
					}
				}
			}
		}

		public static GameObject? GetRandomValuable(Size? size = null)
		{
			if (valuablePrefabsBySize.Count == 0)
			{
				CacheValuables();
			}
			if (size.HasValue)
			{
				if (valuablePrefabsBySize.TryGetValue(size.Value, out List<GameObject> value) && value.Count > 0)
				{
					return value[Random.Range(0, value.Count)];
				}
				return null;
			}
			List<List<GameObject>> list = valuablePrefabsBySize.Values.Where((List<GameObject> l) => l.Count > 0).ToList();
			if (list.Count == 0)
			{
				return null;
			}
			List<GameObject> list2 = list[Random.Range(0, list.Count)];
			return list2[Random.Range(0, list2.Count)];
		}

		public static List<GameObject>? getValuablesWithName(string name)
		{
			string name2 = name;
			if (valuablePrefabsByName.Count == 0)
			{
				CacheValuables();
			}
			return valuablePrefabsByName.Values.Where((GameObject x) => ((Object)x).name.ToLower().Contains(name2.ToLower())).ToList();
		}

		public static GameObject? GetValuableByName(string name)
		{
			if (valuablePrefabsByName.Count == 0)
			{
				CacheValuables();
			}
			GameObject value;
			return valuablePrefabsByName.TryGetValue(name.ToLower(), out value) ? value : null;
		}

		public static List<GameObject> GetValuablesBySize(Size size)
		{
			if (valuablePrefabsBySize.Count == 0)
			{
				CacheValuables();
			}
			List<GameObject> value;
			return valuablePrefabsBySize.TryGetValue(size, out value) ? value : new List<GameObject>();
		}

		public static PlayerAvatar GetPlayerBySteamID(string id)
		{
			string id2 = id;
			PlayerAvatar val = GameDirector.instance.PlayerList.Find((PlayerAvatar x) => x.steamID == id2);
			if ((Object)(object)val == (Object)null)
			{
				return null;
			}
			return val;
		}

		public static bool IsValidGround(Vector3 position, float maxDropDistance = 5f, LayerMask? layerMask = null)
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: 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_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			LayerMask val = (LayerMask)(((??)layerMask) ?? LayerMask.op_Implicit(-5));
			if (!Physics.Raycast(position, Vector3.down, maxDropDistance, LayerMask.op_Implicit(val)))
			{
				return false;
			}
			List<PlayerAvatar> playerList = GameDirector.instance.PlayerList;
			foreach (PlayerAvatar item in playerList)
			{
				if (Vector3.Distance(((Component)item).transform.position, position) < 3f)
				{
					return false;
				}
			}
			return true;
		}

		public static PlayerAvatar GetLocalPlayer()
		{
			foreach (PlayerAvatar player in GameDirector.instance.PlayerList)
			{
				if ((Object)(object)player.photonView != (Object)null && player.photonView.IsMine)
				{
					return player;
				}
			}
			RepoDice.Logger.LogWarning((object)"Local PlayerAvatar not found!");
			return null;
		}

		public static bool isGlitchOrConfig()
		{
			if (SemiFunc.PlayerGetSteamID(PlayerAvatar.instance) == RepoDice.glitchSteamID || RepoDice.IWannaSeeWhatGlitchSees.Value)
			{
				return true;
			}
			return false;
		}

		public static PlayerAvatar GetRandomPlayer()
		{
			List<PlayerAvatar> playerList = GameDirector.instance.PlayerList;
			if (playerList == null || playerList.Count == 0)
			{
				return null;
			}
			int index = Random.Range(0, playerList.Count);
			return playerList[index];
		}

		public static PlayerAvatar? GetRandomAlivePlayer()
		{
			List<PlayerAvatar> list = GameDirector.instance.PlayerList.Where((PlayerAvatar x) => (float)x.playerHealth.health > 0f).ToList();
			if (list.Count == 0)
			{
				return null;
			}
			int index = Random.Range(0, list.Count);
			return list[index];
		}

		public static void SpawnEnemy(string enemyName, int count, Vector3 position, bool isFreebird = false, bool isGlitchy = false, bool fromTry = false, bool hunterStuff = false)
		{
			//IL_0418: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_01af: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bd: 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)
			string enemyName2 = enemyName;
			if (RepoDice.ExtendedLogging.Value)
			{
				foreach (EnemySetup enemy in getEnemies())
				{
					RepoDice.SuperLog("Enemy Found: " + ((Object)enemy).name, (LogLevel)16);
				}
			}
			try
			{
				EnemySetup val = ((IEnumerable<EnemySetup>)getEnemies()).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup x) => ((Object)x).name == enemyName2));
				if ((Object)(object)val == (Object)null)
				{
					val = ((IEnumerable<EnemySetup>)getEnemies()).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup x) => NameContains(x, enemyName2)));
				}
				if ((Object)(object)val == (Object)null)
				{
					RepoDice.SuperLog(enemyName2 + " not found!", (LogLevel)16);
				}
				if (!((Object)(object)val != (Object)null))
				{
					return;
				}
				Vector3 val2 = position + Vector3.forward + Vector3.forward;
				int num = 0;
				bool flag = IsValidGround(val2);
				while (!flag)
				{
					num++;
					val2 = position + new Vector3((float)Random.Range(-3, 4), Random.Range(0.8f, 1.8f), (float)Random.Range(-3, 4));
					flag = IsValidGround(val2);
					if (num > 5)
					{
						break;
					}
				}
				LevelPoint val3 = SemiFunc.LevelPointGet(position, 4f, 20f);
				if (!flag)
				{
					if ((Object)(object)val3 == (Object)null)
					{
						return;
					}
					val2 = ((Component)val3).transform.position;
				}
				for (int i = 0; i < count; i++)
				{
					List<EnemyParent> list = Enemies.SpawnEnemy(val, val2, Quaternion.identity, false);
					RepoDice.SuperLog($"Spawned {list.Count} enemies for '{enemyName2}'", (LogLevel)16);
					if (isFreebird)
					{
						foreach (EnemyParent item in list)
						{
							if (SemiFunc.IsMultiplayer())
							{
								if (SemiFunc.IsMasterClient())
								{
									Networker.Instance.makeFreebirdRpc(((MonoBehaviourPun)item).photonView.ViewID);
									continue;
								}
								((MonoBehaviourPun)Networker.Instance).photonView.RPC("makeFreebirdRpc", (RpcTarget)1, new object[1] { ((MonoBehaviourPun)item).photonView.ViewID });
							}
							else
							{
								Networker.Instance.makeFreebirdRpc(((MonoBehaviourPun)item).photonView.ViewID);
							}
						}
					}
					if (isGlitchy)
					{
						foreach (EnemyParent item2 in list)
						{
							((MonoBehaviourPun)Networker.Instance).photonView.RPC("makeGlassRPC", (RpcTarget)0, new object[3]
							{
								((MonoBehaviourPun)item2).photonView.ViewID,
								true,
								true
							});
						}
					}
					if (!hunterStuff)
					{
						continue;
					}
					int shotsAtOnce = Random.Range(8, 15);
					foreach (EnemyParent item3 in list)
					{
						EnemyHunter componentInChildren = ((Component)item3).GetComponentInChildren<EnemyHunter>();
						if ((Object)(object)componentInChildren != (Object)null)
						{
							FastShooterMono fastShooterMono = ComponentHolderProtocol.AddComponent<FastShooterMono>((Object)(object)((Component)componentInChildren).transform);
							fastShooterMono.hunter = componentInChildren;
							fastShooterMono.shotsAtOnce = shotsAtOnce;
						}
						else
						{
							RepoDice.SuperLog("Hunter " + ((Object)item3).name + " not found!", (LogLevel)16);
						}
					}
				}
			}
			catch (Exception ex)
			{
				if (!fromTry)
				{
					RepoDice.SuperLog("Error with spawning enemy, spawning Animal instead: " + ex, (LogLevel)2);
					SpawnEnemy("Animal", 1, position, isFreebird, isGlitchy, fromTry: true);
				}
			}
		}

		public static bool NameContains(EnemySetup enemySetup, string name)
		{
			if ((Object)(object)enemySetup == (Object)null)
			{
				return false;
			}
			if (LooseStringMatch(((Object)enemySetup).name, name))
			{
				return true;
			}
			EnemyParent val = null;
			foreach (GameObject item in enemySetup.spawnObjects.Where((GameObject x) => (Object)(object)x != (Object)null).Distinct())
			{
				if (!item.TryGetComponent<EnemyParent>(ref val))
				{
				}
			}
			if ((Object)(object)val != (Object)null)
			{
				if (LooseStringMatch(val.enemyName, name))
				{
					return true;
				}
				if (LooseStringMatch(((Object)((Component)val).gameObject).name, name))
				{
					return true;
				}
			}
			return false;
		}

		public static void MakeGlass(Material mat, float alpha = 0.3f, bool fucky = false)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			Color color = mat.color;
			if ((Object)(object)mat == (Object)(object)RepoDice.GlitchyMaterial)
			{
				return;
			}
			if (fucky)
			{
				Shader val = Shader.Find("Autodesk Interactive");
				if ((Object)(object)val == (Object)null)
				{
					RepoDice.SuperLog("Autodesk Interactive shader not found!", (LogLevel)16);
					return;
				}
				mat.shader = val;
			}
			else
			{
				Shader val2 = Shader.Find("Standard");
				if ((Object)(object)val2 == (Object)null)
				{
					RepoDice.SuperLog("Standard shader not found!", (LogLevel)16);
					return;
				}
				mat.shader = val2;
			}
			mat.SetFloat("_Mode", 3f);
			mat.SetInt("_SrcBlend", 5);
			mat.SetInt("_DstBlend", 10);
			mat.SetInt("_ZWrite", 0);
			mat.DisableKeyword("_ALPHATEST_ON");
			mat.EnableKeyword("_ALPHABLEND_ON");
			mat.DisableKeyword("_ALPHAPREMULTIPLY_ON");
			mat.renderQueue = 3000;
			Color color2 = color;
			color2.a = alpha;
			mat.color = color2;
		}

		public static ReadOnlyCollection<EnemySetup> getEnemies()
		{
			if (cachedEnemies.Count == 0)
			{
				List<EnemySetup> list = new List<EnemySetup>();
				list.AddRange(EnemyDirector.instance.enemiesDifficulty1);
				list.AddRange(EnemyDirector.instance.enemiesDifficulty2);
				list.AddRange(EnemyDirector.instance.enemiesDifficulty3);
				cachedEnemies = list;
			}
			return cachedEnemies.AsReadOnly();
		}

		public static bool LooseStringMatch(string a, string b)
		{
			string text = RemoveWhitespace(a).ToLowerInvariant();
			string text2 = RemoveWhitespace(b).ToLowerInvariant();
			return text == text2;
		}

		private static string RemoveWhitespace(string input)
		{
			return new string(input.Where((char c) => !char.IsWhiteSpace(c)).ToArray());
		}

		public static void SpawnAndScaleEnemy(string enemyName, int count, Vector3 position, Vector3 scale, bool isGlitchy = false)
		{
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_010b: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0153: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_026d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0254: Unknown result type (might be due to invalid IL or missing references)
			string enemyName2 = enemyName;
			if (RepoDice.ExtendedLogging.Value)
			{
				foreach (EnemySetup enemy in getEnemies())
				{
					RepoDice.SuperLog("Enemy Found: " + ((Object)enemy).name, (LogLevel)16);
				}
			}
			try
			{
				EnemySetup val = ((IEnumerable<EnemySetup>)getEnemies()).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup x) => ((Object)x).name == enemyName2));
				if ((Object)(object)val == (Object)null)
				{
					val = ((IEnumerable<EnemySetup>)getEnemies()).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup x) => ((Object)x).name.Contains(enemyName2)));
				}
				if ((Object)(object)val == (Object)null)
				{
					RepoDice.SuperLog(enemyName2 + " not found!", (LogLevel)16);
				}
				if (!((Object)(object)val != (Object)null))
				{
					return;
				}
				RepoDice.SuperLog("Spawning enemy: " + ((Object)val).name, (LogLevel)16);
				Vector3 val2 = position + Vector3.forward + Vector3.forward;
				int num = 0;
				bool flag = IsValidGround(val2);
				while (!flag)
				{
					num++;
					val2 = position + new Vector3((float)Random.Range(-3, 4), Random.Range(0.8f, 1.8f), (float)Random.Range(-3, 4));
					flag = IsValidGround(val2);
					if (num > 5)
					{
						break;
					}
				}
				LevelPoint val3 = SemiFunc.LevelPointGet(position, 4f, 20f);
				if (!flag)
				{
					if ((Object)(object)val3 == (Object)null)
					{
						return;
					}
					val2 = ((Component)val3).transform.position;
				}
				for (int i = 0; i < count; i++)
				{
					List<EnemyParent> list = Enemies.SpawnEnemy(val, val2, Quaternion.identity, false);
					foreach (EnemyParent item in list)
					{
						PhotonView component = ((Component)item).GetComponent<PhotonView>();
						if ((Object)(object)component != (Object)null && SemiFunc.IsMasterClientOrSingleplayer())
						{
							if (SemiFunc.IsMultiplayer())
							{
								((MonoBehaviourPun)Networker.Instance).photonView.RPC("SetScale", (RpcTarget)1, new object[2] { component.ViewID, scale });
							}
							Networker.Instance.SetScale(component.ViewID, scale);
						}
					}
					if (!isGlitchy)
					{
						continue;
					}
					foreach (EnemyParent item2 in list)
					{
						((MonoBehaviourPun)Networker.Instance).photonView.RPC("makeGlassRPC", (RpcTarget)0, new object[3]
						{
							((MonoBehaviourPun)item2).photonView.ViewID,
							true,
							true
						});
					}
				}
			}
			catch (Exception ex)
			{
				RepoDice.SuperLog(ex.Message, (LogLevel)2);
			}
		}
	}
	public class Networker : MonoBehaviourPun
	{
		public static Networker Instance;

		private PhotonView photonView;

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

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

		private void Awake()
		{
			if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this)
			{
				RepoDice.SuperLog("", (LogLevel)4);
				Object.Destroy((Object)(object)((Component)this).gameObject);
			}
			else
			{
				Debug.Log((object)"Networker::Awake");
				Instance = this;
				photonView = ((Component)this).GetComponent<PhotonView>();
			}
		}

		private void Start()
		{
			upgrades = StatsManager.instance.FetchPlayerUpgrades(SemiFunc.PlayerGetSteamID(SemiFunc.PlayerAvatarLocal())).Keys.ToList();
		}

		[PunRPC]
		public void SetScale(int viewID, Vector3 scale)
		{
			//IL_0020: 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_0037: 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_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			PhotonView val = PhotonView.Find(viewID);
			if ((Object)(object)val != (Object)null)
			{
				((Component)val).transform.localScale = new Vector3(((Component)val).transform.localScale.x * scale.x, ((Component)val).transform.localScale.y * scale.y, ((Component)val).transform.localScale.z * scale.z);
			}
		}

		[PunRPC]
		public void setStaminaRPC(float stamina)
		{
			if (PlayerAvatar.instance.playerHealth.health != 0)
			{
				PlayerController.instance.EnergyCurrent = stamina;
			}
		}

		[PunRPC]
		public void chooseEffectRPC(int photonViewID)
		{
			if (PlayerAvatar.instance.photonView.ViewID == photonViewID)
			{
				DebugMenu.ShowSelectEffectMenu(fromSaint: true);
			}
		}

		[PunRPC]
		public void reviveRPC(int photonViewID)
		{
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			PlayerAvatar val = SemiFunc.PlayerAvatarGetFromPhotonID(photonViewID);
			if (val.playerHealth.health <= 0)
			{
				if (!val.playerDeathHead.triggered)
				{
					val.playerDeathHead.Trigger();
				}
				if (PhotonNetwork.IsMasterClient)
				{
					val.playerDeathHead.physGrabObject.Teleport(((Component)LevelGenerator.Instance.LevelPathTruck).transform.position + Vector3.up, ((Component)LevelGenerator.Instance.LevelPathTruck).transform.rotation);
					((MonoBehaviour)this).StartCoroutine(waitRevive(val));
				}
			}
		}

		public IEnumerator waitRevive(PlayerAvatar? player)
		{
			PlayerAvatar player2 = player;
			yield return (object)new WaitUntil((Func<bool>)(() => ((Behaviour)player2.playerDeathHead).isActiveAndEnabled));
			yield return (object)new WaitForSeconds(0.5f);
			PlayerAvatar obj = player2;
			if (obj != null)
			{
				obj.Revive(true);
			}
		}

		[PunRPC]
		public void makePlayerGlass(int playerPhotonID, int deathHeadPhotonID, bool reverse)
		{
			PhotonView val = PhotonView.Find(playerPhotonID);
			PhotonView val2 = PhotonView.Find(deathHeadPhotonID);
			MaterialMemory materialMemory = ((Component)val).gameObject.GetComponent<MaterialMemory>();
			if ((Object)(object)materialMemory == (Object)null)
			{
				materialMemory = ((Component)val).gameObject.AddComponent<MaterialMemory>();
			}
			MaterialMemory component = ((Component)val2).gameObject.GetComponent<MaterialMemory>();
			if ((Object)(object)component == (Object)null)
			{
				component = ((Component)val2).gameObject.AddComponent<MaterialMemory>();
			}
			Renderer[] componentsInChildren = ((Component)((Component)val).gameObject.transform.parent.Find("Player Visuals/[RIG]")).GetComponentsInChildren<Renderer>();
			Renderer[] componentsInChildren2 = ((Component)val2).GetComponentsInChildren<Renderer>();
			Renderer[] array = componentsInChildren;
			foreach (Renderer val3 in array)
			{
				if (reverse)
				{
					if (!materialMemory.materials.ContainsKey(val3))
					{
						materialMemory.materials[val3] = val3.material;
					}
					val3.material = RepoDice.GlitchyMaterial;
				}
				else if ((Object)(object)val3.material == (Object)(object)RepoDice.GlitchyMaterial && materialMemory.materials.ContainsKey(val3))
				{
					val3.material = materialMemory.materials[val3];
				}
			}
		}

		public IEnumerator DelayJumpscare()
		{
			yield return (object)new WaitForSeconds(Random.Range(10f, 60f));
			photonView.RPC("doJumpscare", (RpcTarget)0, Array.Empty<object>());
		}

		[PunRPC]
		public void doJumpscare()
		{
			RepoDice.JumpscareScript.Scare();
		}

		[PunRPC]
		public void makeGlassRPC(int photonViewID, bool canBeGlitchy, bool forceGlitchy)
		{
			PhotonView val = PhotonView.Find(photonViewID);
			Renderer[] componentsInChildren = ((Component)val).GetComponentsInChildren<Renderer>();
			MaterialMemory materialMemory = ((Component)val).gameObject.GetComponent<MaterialMemory>();
			if ((Object)(object)materialMemory == (Object)null)
			{
				materialMemory = ((Component)val).gameObject.AddComponent<MaterialMemory>();
			}
			bool flag = forceGlitchy || (RepoDice.glitchyMode.Value && canBeGlitchy && Random.value > 0.9f);
			Renderer[] array = componentsInChildren;
			foreach (Renderer val2 in array)
			{
				if (flag)
				{
					if (!materialMemory.materials.ContainsKey(val2))
					{
						materialMemory.materials[val2] = val2.material;
					}
					val2.material = RepoDice.GlitchyMaterial;
				}
				else
				{
					if ((Object)(object)val2.material == (Object)(object)RepoDice.GlitchyMaterial && materialMemory.materials.ContainsKey(val2))
					{
						val2.material = materialMemory.materials[val2];
					}
					Misc.MakeGlass(val2.material);
				}
			}
		}

		[PunRPC]
		public void forceNeckBreak(int photonViewID)
		{
			if (PlayerAvatar.instance.photonView.ViewID == photonViewID)
			{
				TurnThatFrown.BreakNeck();
			}
		}

		[PunRPC]
		public void makeEverythingMore(float percentage)
		{
			ValuableObject[] array = Object.FindObjectsOfType<ValuableObject>(true);
			ValuableObject[] array2 = array;
			foreach (ValuableObject val in array2)
			{
				val.photonView.RPC("DollarValueSetRPC", (RpcTarget)3, new object[1] { val.dollarValueCurrent * percentage });
			}
		}

		[PunRPC]
		public void makeFreebirdRpc(int photonViewID)
		{
			PhotonView val = PhotonView.Find(photonViewID);
			if ((O

plugins/REPOLib.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using ExitGames.Client.Photon;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using Photon.Realtime;
using REPOLib.Commands;
using REPOLib.Extensions;
using REPOLib.Modules;
using REPOLib.Objects;
using REPOLib.Objects.Sdk;
using REPOLib.Patches;
using Steamworks;
using TMPro;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("Zehs")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyCopyright("Copyright © 2025 Zehs")]
[assembly: AssemblyDescription("Library for adding content to R.E.P.O.")]
[assembly: AssemblyFileVersion("2.1.0.0")]
[assembly: AssemblyInformationalVersion("2.1.0+2a3919a7a0497d73c37672c768f840403b3beb8d")]
[assembly: AssemblyProduct("REPOLib")]
[assembly: AssemblyTitle("REPOLib")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/ZehsTeam/REPOLib")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("2.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.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 REPOLib
{
	public static class BundleLoader
	{
		private class LoadOperation
		{
			public enum State
			{
				LoadingBundle,
				LoadingContent
			}

			public string Path { get; }

			public DateTime StartTime { get; }

			public State CurrentState { get; set; }

			public bool LoadContents { get; }

			public Func<AssetBundle, IEnumerator>? OnBundleLoaded { get; }

			public AssetBundleCreateRequest BundleRequest { get; }

			public TimeSpan ElapsedTime => DateTime.Now - StartTime;

			public string FileName => System.IO.Path.GetFileNameWithoutExtension(Path);

			public LoadOperation(string path, Func<AssetBundle, IEnumerator>? onBundleLoaded = null, bool loadContents = true)
			{
				Path = path;
				StartTime = DateTime.Now;
				LoadContents = loadContents;
				OnBundleLoaded = onBundleLoaded;
				BundleRequest = AssetBundle.LoadFromFileAsync(path);
				base..ctor();
			}
		}

		[StructLayout(LayoutKind.Auto)]
		[CompilerGenerated]
		private struct <>c__DisplayClass11_0
		{
			public LoadOperation operation;
		}

		[CompilerGenerated]
		private sealed class <>c__DisplayClass6_0
		{
			public Action<AssetBundle> onLoaded;
		}

		[CompilerGenerated]
		private sealed class <FinishLoadOperation>d__11 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public LoadOperation operation;

			private <>c__DisplayClass11_0 <>8__1;

			private AssetBundle <bundle>5__2;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <FinishLoadOperation>d__11(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>8__1 = default(<>c__DisplayClass11_0);
				<bundle>5__2 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>8__1.operation = operation;
					<>2__current = <>8__1.operation.BundleRequest;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					<bundle>5__2 = <>8__1.operation.BundleRequest.assetBundle;
					if ((Object)(object)<bundle>5__2 == (Object)null)
					{
						Logger.LogError("Failed to load bundle " + <>8__1.operation.FileName + "!");
						<FinishLoadOperation>g__Finish|11_0(ref <>8__1);
						return false;
					}
					if (<>8__1.operation.LoadContents)
					{
						<>2__current = LoadBundleContent(<>8__1.operation, <bundle>5__2);
						<>1__state = 2;
						return true;
					}
					goto IL_00f6;
				case 2:
					<>1__state = -1;
					goto IL_00f6;
				case 3:
					{
						<>1__state = -1;
						break;
					}
					IL_00f6:
					if (<>8__1.operation.OnBundleLoaded != null)
					{
						<>2__current = <>8__1.operation.OnBundleLoaded(<bundle>5__2);
						<>1__state = 3;
						return true;
					}
					break;
				}
				if (ConfigManager.ExtendedLogging.Value)
				{
					Logger.LogInfo($"Loaded bundle {<>8__1.operation.FileName} in {<>8__1.operation.ElapsedTime.TotalSeconds:N1}s");
				}
				<FinishLoadOperation>g__Finish|11_0(ref <>8__1);
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <FinishLoadOperationsRoutine>d__9 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public MonoBehaviour behaviour;

			private TMP_Text <text>5__2;

			private Action <disableLoadingUI>5__3;

			private float <lastUpdate>5__4;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <FinishLoadOperationsRoutine>d__9(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<text>5__2 = null;
				<disableLoadingUI>5__3 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = null;
					<>1__state = 1;
					return true;
				case 1:
				{
					<>1__state = -1;
					LoadOperation[] array = _operations.ToArray();
					foreach (LoadOperation operation in array)
					{
						behaviour.StartCoroutine(FinishLoadOperation(operation));
					}
					(TMP_Text, Action) tuple = SetupLoadingUI();
					<text>5__2 = tuple.Item1;
					<disableLoadingUI>5__3 = tuple.Item2;
					<lastUpdate>5__4 = Time.time;
					break;
				}
				case 2:
					<>1__state = -1;
					break;
				}
				while (_operations.Count > 0)
				{
					if (Time.time - <lastUpdate>5__4 > 1f)
					{
						<lastUpdate>5__4 = Time.time;
						string arg = ((_operations.Count == 1) ? "bundle" : "bundles");
						<text>5__2.text = $"REPOLib: Waiting for {_operations.Count} {arg} to load...";
						if (!ConfigManager.ExtendedLogging.Value)
						{
							continue;
						}
						foreach (LoadOperation operation2 in _operations)
						{
							string text = $"Loading {operation2.FileName}: {operation2.CurrentState}";
							float? num = ((operation2.CurrentState != 0) ? null : new float?(((AsyncOperation)operation2.BundleRequest).progress));
							float? num2 = num;
							if (num2.HasValue)
							{
								text += $" {num2.Value:P0}";
							}
							Logger.LogDebug(text);
						}
					}
					<>2__current = null;
					<>1__state = 2;
					return true;
				}
				Logger.LogInfo("Finished loading bundles.");
				<disableLoadingUI>5__3();
				Utilities.SafeInvokeEvent(BundleLoader.OnAllBundlesLoaded);
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <LoadBundleContent>d__12 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public LoadOperation operation;

			public AssetBundle bundle;

			private AssetBundleRequest <assetRequest>5__2;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <LoadBundleContent>d__12(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<assetRequest>5__2 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					operation.CurrentState = LoadOperation.State.LoadingContent;
					<assetRequest>5__2 = bundle.LoadAllAssetsAsync<ScriptableObject>();
					<>2__current = <assetRequest>5__2;
					<>1__state = 1;
					return true;
				case 1:
				{
					<>1__state = -1;
					Object[] allAssets = <assetRequest>5__2.allAssets;
					Mod[] array = allAssets.OfType<Mod>().ToArray();
					int num = array.Length;
					if (num <= 1)
					{
						if (num == 0)
						{
							Logger.LogError("Bundle " + operation.FileName + " contains no mods!");
							return false;
						}
						Mod mod = array[0];
						foreach (Content item in allAssets.OfType<Content>())
						{
							try
							{
								item.Initialize(mod);
							}
							catch (Exception ex)
							{
								Logger.LogError($"Failed to load {item.Name} ({((object)item).GetType().Name}) from bundle {operation.FileName} ({mod.Identifier}): {ex}");
							}
						}
						return false;
					}
					Logger.LogError("Bundle " + operation.FileName + " contains more than one mod!");
					return false;
				}
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		private static readonly List<LoadOperation> _operations = new List<LoadOperation>();

		public static event Action? OnAllBundlesLoaded;

		internal static void LoadAllBundles(string root, string withExtension)
		{
			Logger.LogInfo("Loading all bundles with extension " + withExtension + " from root " + root, extended: true);
			string[] files = Directory.GetFiles(root, "*" + withExtension, SearchOption.AllDirectories);
			string[] array = files;
			foreach (string path in array)
			{
				LoadBundleAndContent(path);
			}
		}

		public static void LoadBundleAndContent(string path)
		{
			LoadBundle(path, (Func<AssetBundle, IEnumerator>?)null, loadContents: true);
		}

		public static void LoadBundle(string path, Action<AssetBundle> onLoaded, bool loadContents = false)
		{
			<>c__DisplayClass6_0 CS$<>8__locals0 = new <>c__DisplayClass6_0();
			CS$<>8__locals0.onLoaded = onLoaded;
			LoadBundle(path, (Func<AssetBundle, IEnumerator>?)OnLoaded, loadContents);
			[IteratorStateMachine(typeof(<>c__DisplayClass6_0.<<LoadBundle>g__OnLoaded|0>d))]
			IEnumerator OnLoaded(AssetBundle bundle)
			{
				//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
				return new <>c__DisplayClass6_0.<<LoadBundle>g__OnLoaded|0>d(0)
				{
					<>4__this = CS$<>8__locals0,
					bundle = bundle
				};
			}
		}

		public static void LoadBundle(string path, Func<AssetBundle, IEnumerator>? onLoaded = null, bool loadContents = false)
		{
			Logger.LogInfo("Loading bundle at " + path + "...");
			_operations.Add(new LoadOperation(path, onLoaded, loadContents));
		}

		internal static void FinishLoadOperations(MonoBehaviour behaviour)
		{
			behaviour.StartCoroutine(FinishLoadOperationsRoutine(behaviour));
		}

		[IteratorStateMachine(typeof(<FinishLoadOperationsRoutine>d__9))]
		private static IEnumerator FinishLoadOperationsRoutine(MonoBehaviour behaviour)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <FinishLoadOperationsRoutine>d__9(0)
			{
				behaviour = behaviour
			};
		}

		private static (TMP_Text, Action) SetupLoadingUI()
		{
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = GameObject.Find("HUD Canvas");
			Transform hud = val.transform.Find("HUD");
			((Component)hud).gameObject.SetActive(false);
			TMP_Text val2 = Object.FindObjectOfType<TMP_Text>();
			TMP_Text text = Object.Instantiate<TMP_Text>(val2, val.transform);
			((Object)((Component)text).gameObject).name = "REPOLibText";
			((Component)text).gameObject.SetActive(true);
			text.text = "REPOLib is loading bundles... Hang tight!";
			((Graphic)text).color = Color.white;
			text.alignment = (TextAlignmentOptions)514;
			RectTransform component = ((Component)text).GetComponent<RectTransform>();
			component.anchoredPosition = Vector2.zero;
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.sizeDelta = Vector2.zero;
			return (text, delegate
			{
				((Component)text).gameObject.SetActive(false);
				((Component)hud).gameObject.SetActive(true);
			});
		}

		[IteratorStateMachine(typeof(<FinishLoadOperation>d__11))]
		private static IEnumerator FinishLoadOperation(LoadOperation operation)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <FinishLoadOperation>d__11(0)
			{
				operation = operation
			};
		}

		[IteratorStateMachine(typeof(<LoadBundleContent>d__12))]
		private static IEnumerator LoadBundleContent(LoadOperation operation, AssetBundle bundle)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <LoadBundleContent>d__12(0)
			{
				operation = operation,
				bundle = bundle
			};
		}

		[Obsolete("Use LoadBundleAndContent instead")]
		public static void LoadBundle(string path, string relativePath)
		{
			LoadBundleAndContent(path);
		}

		[CompilerGenerated]
		internal static void <FinishLoadOperation>g__Finish|11_0(ref <>c__DisplayClass11_0 P_0)
		{
			_operations.Remove(P_0.operation);
		}
	}
	internal static class ConfigManager
	{
		public static ConfigFile ConfigFile { get; private set; }

		public static ConfigEntry<bool> ExtendedLogging { get; private set; }

		public static ConfigEntry<bool> DeveloperMode { get; private set; }

		public static ConfigEntry<bool> VanillaDeveloperMode { get; private set; }

		public static void Initialize(ConfigFile configFile)
		{
			ConfigFile = configFile;
			BindConfigs();
		}

		private static void BindConfigs()
		{
			ExtendedLogging = ConfigFile.Bind<bool>("General", "ExtendedLogging", false, "Enable extended logging.");
			DeveloperMode = ConfigFile.Bind<bool>("General", "DeveloperMode", false, "Enable developer mode cheats for testing.");
			VanillaDeveloperMode = ConfigFile.Bind<bool>("General", "VanillaDeveloperMode", false, "Enable vanilla developer mode cheats for testing.");
			VanillaDeveloperMode.SettingChanged += delegate
			{
				SteamManagerPatch.UpdateDeveloperMode();
			};
		}
	}
	internal static class Logger
	{
		public static ManualLogSource ManualLogSource { get; private set; }

		public static void Initialize(ManualLogSource manualLogSource)
		{
			ManualLogSource = manualLogSource;
		}

		public static void LogDebug(object data)
		{
			Log((LogLevel)32, data);
		}

		public static void LogInfo(object data, bool extended = false)
		{
			Log((LogLevel)16, data, extended);
		}

		public static void LogWarning(object data, bool extended = false)
		{
			Log((LogLevel)4, data, extended);
		}

		public static void LogError(object data, bool extended = false)
		{
			Log((LogLevel)2, data, extended);
		}

		public static void LogFatal(object data, bool extended = false)
		{
			Log((LogLevel)1, data, extended);
		}

		public static void Log(LogLevel logLevel, object data, bool extended = false)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			if (!extended || IsExtendedLoggingEnabled())
			{
				ManualLogSource manualLogSource = ManualLogSource;
				if (manualLogSource != null)
				{
					manualLogSource.Log(logLevel, data);
				}
			}
		}

		public static bool IsExtendedLoggingEnabled()
		{
			if (ConfigManager.ExtendedLogging == null)
			{
				return false;
			}
			return ConfigManager.ExtendedLogging.Value;
		}
	}
	[BepInPlugin("REPOLib", "REPOLib", "2.1.0")]
	public class Plugin : BaseUnityPlugin
	{
		private readonly Harmony _harmony = new Harmony("REPOLib");

		public static Plugin Instance { get; private set; }

		private void Awake()
		{
			Instance = this;
			Logger.Initialize(Logger.CreateLogSource("REPOLib"));
			Logger.LogInfo("REPOLib has awoken!");
			_harmony.PatchAll(typeof(RunManagerPatch));
			_harmony.PatchAll(typeof(EnemyDirectorPatch));
			_harmony.PatchAll(typeof(StatsManagerPatch));
			_harmony.PatchAll(typeof(SemiFuncPatch));
			_harmony.PatchAll(typeof(AudioManagerPatch));
			_harmony.PatchAll(typeof(SteamManagerPatch));
			_harmony.PatchAll(typeof(EnemyGnomeDirectorPatch));
			_harmony.PatchAll(typeof(EnemyBangDirectorPatch));
			_harmony.PatchAll(typeof(PlayerControllerPatch));
			ConfigManager.Initialize(((BaseUnityPlugin)this).Config);
			Upgrades.Initialize();
			BundleLoader.LoadAllBundles(Paths.PluginPath, ".repobundle");
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "REPOLib";

		public const string PLUGIN_NAME = "REPOLib";

		public const string PLUGIN_VERSION = "2.1.0";
	}
}
namespace REPOLib.Patches
{
	[HarmonyPatch(typeof(AudioManager))]
	internal static class AudioManagerPatch
	{
		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		private static void StartPatch()
		{
			Utilities.FixAudioMixerGroupsOnPrefabs();
		}
	}
	[HarmonyPatch(typeof(EnemyBangDirector))]
	internal static class EnemyBangDirectorPatch
	{
		[CompilerGenerated]
		private sealed class <PreSetup>d__1 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public EnemyBangDirector instance;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <PreSetup>d__1(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0034: Unknown result type (might be due to invalid IL or missing references)
				//IL_003e: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					if (LevelGenerator.Instance.Generated)
					{
						<>2__current = (object)new WaitForSeconds(0.1f);
						<>1__state = 1;
						return true;
					}
					goto IL_004e;
				case 1:
					<>1__state = -1;
					goto IL_004e;
				case 2:
					{
						<>1__state = -1;
						return false;
					}
					IL_004e:
					<>2__current = instance.Setup();
					<>1__state = 2;
					return true;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[HarmonyPatch("Awake")]
		[HarmonyTranspiler]
		private static IEnumerable<CodeInstruction> AwakeTranspiler(IEnumerable<CodeInstruction> instructions)
		{
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Expected O, but got Unknown
			MethodInfo methodInfo = AccessTools.Method(typeof(EnemyBangDirector), "Setup", (Type[])null, (Type[])null);
			MethodInfo methodInfo2 = AccessTools.Method(typeof(EnemyBangDirectorPatch), "PreSetup", (Type[])null, (Type[])null);
			if (methodInfo == null || methodInfo2 == null)
			{
				Logger.LogError("EnemyBangDirectorPatch: failed to find required methods for AwakeTranspiler.");
				return instructions;
			}
			List<CodeInstruction> list = new List<CodeInstruction>();
			foreach (CodeInstruction instruction in instructions)
			{
				if ((instruction.opcode == OpCodes.Call || instruction.opcode == OpCodes.Callvirt) && instruction.operand is MethodInfo methodInfo3 && methodInfo3 == methodInfo)
				{
					list.Add(new CodeInstruction(OpCodes.Call, (object)methodInfo2));
					Logger.LogDebug("EnemyBangDirectorPatch: AwakeTranspiler replaced " + methodInfo.Name + " call with " + methodInfo2.Name + ".");
				}
				else
				{
					list.Add(instruction);
				}
			}
			return list.AsEnumerable();
		}

		[IteratorStateMachine(typeof(<PreSetup>d__1))]
		private static IEnumerator PreSetup(EnemyBangDirector instance)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <PreSetup>d__1(0)
			{
				instance = instance
			};
		}
	}
	[HarmonyPatch(typeof(EnemyDirector))]
	internal static class EnemyDirectorPatch
	{
		private static bool _alreadyRegistered;

		[HarmonyPatch("Awake")]
		[HarmonyPostfix]
		private static void AwakePatch()
		{
			if (_alreadyRegistered)
			{
				foreach (EnemySetup registeredEnemy in Enemies.RegisteredEnemies)
				{
					EnemyDirector.instance.AddEnemy(registeredEnemy);
				}
				return;
			}
			Enemies.RegisterInitialEnemies();
			_alreadyRegistered = true;
		}
	}
	[HarmonyPatch(typeof(EnemyGnomeDirector))]
	internal static class EnemyGnomeDirectorPatch
	{
		[CompilerGenerated]
		private sealed class <PreSetup>d__1 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public EnemyGnomeDirector instance;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <PreSetup>d__1(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0034: Unknown result type (might be due to invalid IL or missing references)
				//IL_003e: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					if (LevelGenerator.Instance.Generated)
					{
						<>2__current = (object)new WaitForSeconds(0.1f);
						<>1__state = 1;
						return true;
					}
					goto IL_004e;
				case 1:
					<>1__state = -1;
					goto IL_004e;
				case 2:
					{
						<>1__state = -1;
						return false;
					}
					IL_004e:
					<>2__current = instance.Setup();
					<>1__state = 2;
					return true;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[HarmonyPatch("Awake")]
		[HarmonyTranspiler]
		private static IEnumerable<CodeInstruction> AwakeTranspiler(IEnumerable<CodeInstruction> instructions)
		{
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Expected O, but got Unknown
			MethodInfo methodInfo = AccessTools.Method(typeof(EnemyGnomeDirector), "Setup", (Type[])null, (Type[])null);
			MethodInfo methodInfo2 = AccessTools.Method(typeof(EnemyGnomeDirectorPatch), "PreSetup", (Type[])null, (Type[])null);
			if (methodInfo == null || methodInfo2 == null)
			{
				Logger.LogError("EnemyGnomeDirectorPatch: failed to find required methods for AwakeTranspiler.");
				return instructions;
			}
			List<CodeInstruction> list = new List<CodeInstruction>();
			foreach (CodeInstruction instruction in instructions)
			{
				if ((instruction.opcode == OpCodes.Call || instruction.opcode == OpCodes.Callvirt) && instruction.operand is MethodInfo methodInfo3 && methodInfo3 == methodInfo)
				{
					list.Add(new CodeInstruction(OpCodes.Call, (object)methodInfo2));
					Logger.LogDebug("EnemyGnomeDirectorPatch: AwakeTranspiler replaced " + methodInfo.Name + " call with " + methodInfo2.Name + ".");
				}
				else
				{
					list.Add(instruction);
				}
			}
			return list.AsEnumerable();
		}

		[IteratorStateMachine(typeof(<PreSetup>d__1))]
		private static IEnumerator PreSetup(EnemyGnomeDirector instance)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <PreSetup>d__1(0)
			{
				instance = instance
			};
		}
	}
	[HarmonyPatch(typeof(PlayerController))]
	internal static class PlayerControllerPatch
	{
		[CompilerGenerated]
		private sealed class <LateStartTranspiler>d__0 : IEnumerable<CodeInstruction>, IEnumerable, IEnumerator<CodeInstruction>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private CodeInstruction <>2__current;

			private int <>l__initialThreadId;

			private IEnumerable<CodeInstruction> instructions;

			public IEnumerable<CodeInstruction> <>3__instructions;

			private bool <found>5__2;

			private List<CodeInstruction>.Enumerator <>7__wrap2;

			CodeInstruction IEnumerator<CodeInstruction>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <LateStartTranspiler>d__0(int <>1__state)
			{
				this.<>1__state = <>1__state;
				<>l__initialThreadId = Environment.CurrentManagedThreadId;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				int num = <>1__state;
				if (num == -3 || num == 1)
				{
					try
					{
					}
					finally
					{
						<>m__Finally1();
					}
				}
				<>7__wrap2 = default(List<CodeInstruction>.Enumerator);
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0168: Unknown result type (might be due to invalid IL or missing references)
				//IL_0172: Expected O, but got Unknown
				//IL_017b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0185: Expected O, but got Unknown
				try
				{
					switch (<>1__state)
					{
					default:
						return false;
					case 0:
					{
						<>1__state = -1;
						FieldInfo fieldInfo = AccessTools.Field(typeof(PlayerController), "playerAvatarScript");
						MethodInfo methodInfo = AccessTools.Method(typeof(SemiFunc), "PlayerGetSteamID", new Type[1] { typeof(PlayerAvatar) }, (Type[])null);
						MethodInfo methodInfo2 = AccessTools.Method(typeof(Upgrades), "InvokeStartActions", new Type[1] { typeof(string) }, (Type[])null);
						<found>5__2 = false;
						int num = 0;
						List<CodeInstruction> list = new List<CodeInstruction>();
						foreach (CodeInstruction instruction in instructions)
						{
							list.Add(instruction);
							if (num switch
							{
								0 => instruction.opcode == OpCodes.Ldloc_1, 
								1 => instruction.opcode == OpCodes.Ldfld && CodeInstructionExtensions.LoadsField(instruction, fieldInfo, false), 
								2 => instruction.opcode == OpCodes.Call && CodeInstructionExtensions.Calls(instruction, methodInfo), 
								3 => instruction.opcode == OpCodes.Stloc_2, 
								_ => false, 
							})
							{
								num++;
								if (num > 3)
								{
									<found>5__2 = true;
									num = 0;
									list.Add(new CodeInstruction(OpCodes.Ldloc_2, (object)null));
									list.Add(new CodeInstruction(OpCodes.Call, (object)methodInfo2));
								}
							}
							else
							{
								num = 0;
							}
						}
						<>7__wrap2 = list.GetEnumerator();
						<>1__state = -3;
						break;
					}
					case 1:
						<>1__state = -3;
						break;
					}
					if (<>7__wrap2.MoveNext())
					{
						CodeInstruction current2 = <>7__wrap2.Current;
						<>2__current = current2;
						<>1__state = 1;
						return true;
					}
					<>m__Finally1();
					<>7__wrap2 = default(List<CodeInstruction>.Enumerator);
					if (!<found>5__2)
					{
						Logger.LogWarning("Failed to patch PlayerController.LateStart!");
					}
					return false;
				}
				catch
				{
					//try-fault
					((IDisposable)this).Dispose();
					throw;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			private void <>m__Finally1()
			{
				<>1__state = -1;
				((IDisposable)<>7__wrap2).Dispose();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}

			[DebuggerHidden]
			IEnumerator<CodeInstruction> IEnumerable<CodeInstruction>.GetEnumerator()
			{
				<LateStartTranspiler>d__0 <LateStartTranspiler>d__;
				if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
				{
					<>1__state = 0;
					<LateStartTranspiler>d__ = this;
				}
				else
				{
					<LateStartTranspiler>d__ = new <LateStartTranspiler>d__0(0);
				}
				<LateStartTranspiler>d__.instructions = <>3__instructions;
				return <LateStartTranspiler>d__;
			}

			[DebuggerHidden]
			IEnumerator IEnumerable.GetEnumerator()
			{
				return ((IEnumerable<CodeInstruction>)this).GetEnumerator();
			}
		}

		[IteratorStateMachine(typeof(<LateStartTranspiler>d__0))]
		[HarmonyPatch(/*Could not decode attribute arguments.*/)]
		[HarmonyTranspiler]
		private static IEnumerable<CodeInstruction> LateStartTranspiler(IEnumerable<CodeInstruction> instructions)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <LateStartTranspiler>d__0(-2)
			{
				<>3__instructions = instructions
			};
		}
	}
	[HarmonyPatch(typeof(RunManager))]
	internal static class RunManagerPatch
	{
		private static bool _patchedAwake;

		[HarmonyPatch("Awake")]
		[HarmonyPostfix]
		[HarmonyPriority(0)]
		private static void AwakePatch(RunManager __instance)
		{
			if (!_patchedAwake)
			{
				_patchedAwake = true;
				NetworkPrefabs.Initialize();
				NetworkingEvents.Initialize();
				Levels.RegisterInitialLevels();
				Valuables.RegisterInitialValuables();
				BundleLoader.OnAllBundlesLoaded += CommandManager.Initialize;
				BundleLoader.FinishLoadOperations((MonoBehaviour)(object)__instance);
			}
		}
	}
	[HarmonyPatch(typeof(SemiFunc))]
	internal static class SemiFuncPatch
	{
		[HarmonyPatch("Command")]
		[HarmonyPrefix]
		private static bool CommandPatch(string _command)
		{
			if (_command.StartsWith("/"))
			{
				return Command(_command);
			}
			return true;
		}

		private static bool Command(string message)
		{
			string text = message.ToLower();
			string text2 = text.Split(' ')[0].Substring(1);
			string text3 = "";
			if (text.Length > text2.Length)
			{
				text3 = text.Substring(text2.Length + 1).Trim();
			}
			CommandManager.CommandExecutionMethods.TryGetValue(text2, out MethodInfo value);
			if (value != null)
			{
				CommandExecutionAttribute customAttribute = value.GetCustomAttribute<CommandExecutionAttribute>();
				if (CommandManager.CommandsEnabled.TryGetValue(customAttribute.Name, out var value2) && !value2)
				{
					return false;
				}
				if (customAttribute != null && customAttribute.RequiresDeveloperMode && !ConfigManager.DeveloperMode.Value)
				{
					Logger.LogWarning("Command " + text2 + " requires developer mode to be enabled. Enable it in REPOLib.cfg");
					return false;
				}
				try
				{
					ParameterInfo[] parameters = value.GetParameters();
					if (parameters.Length == 0)
					{
						value.Invoke(null, null);
					}
					else
					{
						value.Invoke(null, new object[1] { text3 });
					}
				}
				catch (Exception arg)
				{
					Logger.LogError($"Error executing command: {arg}");
				}
				return false;
			}
			return true;
		}

		[HarmonyPatch("EnemySpawn")]
		[HarmonyPrefix]
		private static bool EnemySpawnPatch(ref bool __result)
		{
			if (Enemies.SpawnNextEnemiesNotDespawned > 0)
			{
				Enemies.SpawnNextEnemiesNotDespawned--;
				__result = true;
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(StatsManager))]
	internal static class StatsManagerPatch
	{
		[HarmonyPatch("RunStartStats")]
		[HarmonyPostfix]
		private static void RunStartStatsPatch()
		{
			Items.RegisterItems();
			Upgrades.RegisterUpgrades();
		}
	}
	[HarmonyPatch(typeof(SteamManager))]
	internal static class SteamManagerPatch
	{
		[HarmonyPatch("Awake")]
		[HarmonyPostfix]
		public static void AwakePatch(SteamManager __instance)
		{
			UpdateDeveloperMode();
		}

		public static void UpdateDeveloperMode()
		{
			if (ConfigManager.VanillaDeveloperMode == null || (Object)(object)SteamManager.instance == (Object)null)
			{
				return;
			}
			bool value = ConfigManager.VanillaDeveloperMode.Value;
			if (SteamManager.instance.developerMode != value)
			{
				if (value)
				{
					Logger.LogInfo("Enabling vanilla developer mode.");
				}
				else
				{
					Logger.LogInfo("Disabling vanilla developer mode.");
				}
			}
			SteamManager.instance.developerMode = value;
		}
	}
}
namespace REPOLib.Objects
{
	internal class CustomPrefabPool : IPunPrefabPool
	{
		public readonly Dictionary<string, GameObject> Prefabs = new Dictionary<string, GameObject>();

		private DefaultPool? _defaultPool;

		public DefaultPool DefaultPool
		{
			get
			{
				//IL_0009: Unknown result type (might be due to invalid IL or missing references)
				//IL_0013: Expected O, but got Unknown
				if (_defaultPool == null)
				{
					_defaultPool = new DefaultPool();
				}
				return _defaultPool;
			}
			set
			{
				if (value != null)
				{
					_defaultPool = value;
				}
			}
		}

		public bool RegisterPrefab(string prefabId, GameObject prefab)
		{
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)prefab == (Object)null)
			{
				throw new ArgumentException("CustomPrefabPool: failed to register network prefab. Prefab is null.");
			}
			if (string.IsNullOrWhiteSpace(prefabId))
			{
				throw new ArgumentException("CustomPrefabPool: failed to register network prefab. PrefabId is invalid.");
			}
			if (ResourcesHelper.HasPrefab(prefabId))
			{
				Logger.LogError("CustomPrefabPool: failed to register network prefab \"" + prefabId + "\". Prefab already exists in Resources with the same prefab id.");
				return false;
			}
			if (Prefabs.TryGetValue(prefabId, out GameObject value, ignoreKeyCase: true))
			{
				LogLevel logLevel = (LogLevel)(((Object)(object)value == (Object)(object)prefab) ? 4 : 2);
				Logger.Log(logLevel, "CustomPrefabPool: failed to register network prefab \"" + prefabId + "\". There is already a prefab registered with the same prefab id.");
				return false;
			}
			Prefabs[prefabId] = prefab;
			Logger.LogDebug("CustomPrefabPool: registered network prefab \"" + prefabId + "\"");
			return true;
		}

		public bool HasPrefab(GameObject prefab)
		{
			if (Prefabs.ContainsValue(prefab))
			{
				return true;
			}
			if (ResourcesHelper.HasPrefab(prefab))
			{
				return true;
			}
			return false;
		}

		public bool HasPrefab(string prefabId)
		{
			return (Object)(object)GetPrefab(prefabId) != (Object)null;
		}

		public string? GetPrefabId(GameObject prefab)
		{
			if ((Object)(object)prefab == (Object)null)
			{
				Logger.LogError("Failed to get prefab id. GameObject is null.");
				return string.Empty;
			}
			return Prefabs.GetKeyOrDefault(prefab);
		}

		public GameObject? GetPrefab(string prefabId)
		{
			if (Prefabs.TryGetValue(prefabId, out GameObject value, ignoreKeyCase: true))
			{
				return value;
			}
			return Resources.Load<GameObject>(prefabId);
		}

		public GameObject? Instantiate(string prefabId, Vector3 position, Quaternion rotation)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			if (string.IsNullOrWhiteSpace(prefabId))
			{
				throw new ArgumentException("CustomPrefabPool: failed to spawn network prefab. PrefabId is null.");
			}
			GameObject val;
			if (!Prefabs.TryGetValue(prefabId, out GameObject value, ignoreKeyCase: true))
			{
				val = DefaultPool.Instantiate(prefabId, position, rotation);
				if ((Object)(object)val == (Object)null)
				{
					Logger.LogError("CustomPrefabPool: failed to spawn network prefab \"" + prefabId + "\". GameObject is null.");
				}
				return val;
			}
			bool activeSelf = value.activeSelf;
			if (activeSelf)
			{
				value.SetActive(false);
			}
			val = Object.Instantiate<GameObject>(value, position, rotation);
			if (activeSelf)
			{
				value.SetActive(true);
			}
			Logger.LogInfo($"CustomPrefabPool: spawned network prefab \"{prefabId}\" at position {position}, rotation {((Quaternion)(ref rotation)).eulerAngles}", extended: true);
			return val;
		}

		public void Destroy(GameObject gameObject)
		{
			Object.Destroy((Object)(object)gameObject);
		}
	}
	internal class UnityObjectNameComparer<T> : IEqualityComparer<T> where T : Object
	{
		public StringComparison ComparisonType { get; private set; }

		public UnityObjectNameComparer(StringComparison comparisonType = StringComparison.OrdinalIgnoreCase)
		{
			ComparisonType = comparisonType;
		}

		public bool Equals(T x, T y)
		{
			if ((Object)(object)x == (Object)(object)y)
			{
				return true;
			}
			if ((Object)(object)x == (Object)null || (Object)(object)y == (Object)null)
			{
				return false;
			}
			return ((Object)x).name.Equals(((Object)y).name, ComparisonType);
		}

		public int GetHashCode(T obj)
		{
			if (!((Object)(object)obj != (Object)null))
			{
				return 0;
			}
			return ((Object)obj).name.GetHashCode();
		}
	}
}
namespace REPOLib.Objects.Sdk
{
	public abstract class Content : ScriptableObject
	{
		public abstract string Name { get; }

		public abstract void Initialize(Mod mod);
	}
	[CreateAssetMenu(menuName = "REPOLib/Enemy", order = 3, fileName = "New Enemy")]
	public class EnemyContent : Content
	{
		[SerializeField]
		private EnemySetup _setup;

		public EnemySetup Setup => _setup;

		public override string Name
		{
			get
			{
				EnemySetup setup = Setup;
				return ((setup != null) ? ((Object)setup).name : null) ?? string.Empty;
			}
		}

		public override void Initialize(Mod mod)
		{
			Enemies.RegisterEnemy(Setup);
		}
	}
	[CreateAssetMenu(menuName = "REPOLib/Item", order = 2, fileName = "New Item")]
	public class ItemContent : Content
	{
		[SerializeField]
		private ItemAttributes _prefab;

		public ItemAttributes Prefab => _prefab;

		public override string Name
		{
			get
			{
				ItemAttributes prefab = Prefab;
				return ((prefab != null) ? ((Object)prefab).name : null) ?? string.Empty;
			}
		}

		public override void Initialize(Mod mod)
		{
			_prefab.item.prefab = ((Component)_prefab).gameObject;
			Items.RegisterItem(Prefab.item);
		}
	}
	[CreateAssetMenu(menuName = "REPOLib/Level", order = 4, fileName = "New Level")]
	public class LevelContent : Content
	{
		[SerializeField]
		private Level _level;

		public Level Level => _level;

		public override string Name
		{
			get
			{
				Level level = Level;
				return ((level != null) ? ((Object)level).name : null) ?? string.Empty;
			}
		}

		public override void Initialize(Mod mod)
		{
			Levels.RegisterLevel(Level);
		}
	}
	[CreateAssetMenu(menuName = "REPOLib/Mod", order = 0, fileName = "New Mod")]
	public class Mod : ScriptableObject
	{
		[SerializeField]
		private string _name;

		[SerializeField]
		private string _author;

		[SerializeField]
		private string _version = "1.0.0";

		[SerializeField]
		private string _description;

		[SerializeField]
		private string _websiteUrl;

		[SerializeField]
		private string[] _dependencies = new string[1] { "Zehs-REPOLib-2.1.0" };

		[SerializeField]
		private Sprite _icon;

		[SerializeField]
		private TextAsset _readme;

		public string Name => _name;

		public string Author => _author;

		public string Version => _version;

		public string Description => _description;

		public string WebsiteUrl => _websiteUrl;

		public IReadOnlyList<string> Dependencies => _dependencies;

		public Sprite Icon => _icon;

		public TextAsset Readme => _readme;

		public string FullName => Author + "-" + Name;

		public string Identifier => Author + "-" + Name + "-" + Version;
	}
	[CreateAssetMenu(menuName = "REPOLib/Valuable", order = 1, fileName = "New Valuable")]
	public class ValuableContent : Content
	{
		[SerializeField]
		private ValuableObject _prefab;

		[SerializeField]
		private string[] _valuablePresets = new string[1] { "Valuables - Generic" };

		public ValuableObject Prefab => _prefab;

		public IReadOnlyList<string> ValuablePresets => _valuablePresets;

		public override string Name
		{
			get
			{
				ValuableObject prefab = Prefab;
				return ((prefab != null) ? ((Object)prefab).name : null) ?? string.Empty;
			}
		}

		public override void Initialize(Mod mod)
		{
			Valuables.RegisterValuable(((Component)Prefab).gameObject, ValuablePresets.ToList());
		}
	}
}
namespace REPOLib.Modules
{
	public static class Enemies
	{
		internal static int SpawnNextEnemiesNotDespawned = 0;

		private static readonly List<EnemySetup> _enemiesToRegister = new List<EnemySetup>();

		private static readonly List<EnemySetup> _enemiesRegistered = new List<EnemySetup>();

		private static bool _initialEnemiesRegistered;

		public static IReadOnlyList<EnemySetup> AllEnemies => GetEnemies();

		public static IReadOnlyList<EnemySetup> RegisteredEnemies => _enemiesRegistered;

		internal static void RegisterInitialEnemies()
		{
			if (_initialEnemiesRegistered)
			{
				return;
			}
			foreach (EnemySetup item in _enemiesToRegister)
			{
				RegisterEnemyWithGame(item);
			}
			_enemiesToRegister.Clear();
			_initialEnemiesRegistered = true;
		}

		private static void RegisterEnemyWithGame(EnemySetup enemy)
		{
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			if (!_enemiesRegistered.Contains(enemy) && enemy.TryGetEnemyParent(out EnemyParent enemyParent))
			{
				if (EnemyDirector.instance.AddEnemy(enemy))
				{
					_enemiesRegistered.Add(enemy);
					Logger.LogInfo($"Added enemy \"{enemyParent.enemyName}\" to difficulty {enemyParent.difficulty}", extended: true);
				}
				else
				{
					Logger.LogWarning($"Failed to add enemy \"{enemyParent.enemyName}\" to difficulty {enemyParent.difficulty}", extended: true);
				}
			}
		}

		public static void RegisterEnemy(EnemySetup enemySetup)
		{
			if ((Object)(object)enemySetup == (Object)null || enemySetup.spawnObjects == null || enemySetup.spawnObjects.Count == 0)
			{
				throw new ArgumentException("Failed to register enemy. EnemySetup or spawnObjects list is empty.");
			}
			EnemyParent enemyParent = enemySetup.GetEnemyParent();
			if ((Object)(object)enemyParent == (Object)null)
			{
				Logger.LogError("Failed to register enemy \"" + ((Object)enemySetup).name + "\". No enemy prefab found in spawnObjects list.");
				return;
			}
			if (ResourcesHelper.HasEnemyPrefab(enemySetup))
			{
				Logger.LogError("Failed to register enemy \"" + enemyParent.enemyName + "\". Enemy prefab already exists in Resources with the same name.");
				return;
			}
			if (_enemiesToRegister.Contains(enemySetup))
			{
				Logger.LogError("Failed to register enemy \"" + enemyParent.enemyName + "\". Enemy is already registered!");
				return;
			}
			foreach (GameObject distinctSpawnObject in enemySetup.GetDistinctSpawnObjects())
			{
				foreach (EnemySetup item in _enemiesToRegister)
				{
					if (item.AnySpawnObjectsNameEqualsThatIsNotTheSameObject(distinctSpawnObject))
					{
						Logger.LogError("Failed to register enemy \"" + enemyParent.enemyName + "\". Enemy \"" + ((Object)item).name + "\" already has a spawn object called \"" + ((Object)distinctSpawnObject).name + "\"");
						return;
					}
				}
			}
			foreach (GameObject distinctSpawnObject2 in enemySetup.GetDistinctSpawnObjects())
			{
				string enemyPrefabPath = ResourcesHelper.GetEnemyPrefabPath(distinctSpawnObject2);
				if (!NetworkPrefabs.HasNetworkPrefab(enemyPrefabPath))
				{
					NetworkPrefabs.RegisterNetworkPrefab(enemyPrefabPath, distinctSpawnObject2);
				}
				Utilities.FixAudioMixerGroups(distinctSpawnObject2);
			}
			if (_initialEnemiesRegistered)
			{
				RegisterEnemyWithGame(enemySetup);
			}
			else
			{
				_enemiesToRegister.Add(enemySetup);
			}
		}

		public static List<EnemyParent>? SpawnEnemy(EnemySetup enemySetup, Vector3 position, Quaternion rotation, bool spawnDespawned = true)
		{
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0241: Unknown result type (might be due to invalid IL or missing references)
			//IL_0194: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)enemySetup == (Object)null)
			{
				Logger.LogError("Failed to spawn enemy. EnemySetup is null.");
				return null;
			}
			if (!enemySetup.TryGetEnemyParent(out EnemyParent enemyParent))
			{
				Logger.LogError("Failed to spawn enemy. EnemyParent is null.");
				return null;
			}
			if ((Object)(object)LevelGenerator.Instance == (Object)null)
			{
				Logger.LogError("Failed to spawn enemy \"" + enemyParent.enemyName + "\". EnemySetup instance is null.");
				return null;
			}
			if ((Object)(object)RunManager.instance == (Object)null)
			{
				Logger.LogError("Failed to spawn enemy \"" + enemyParent.enemyName + "\". RunManager instance is null.");
				return null;
			}
			if ((Object)(object)EnemyDirector.instance == (Object)null)
			{
				Logger.LogError("Failed to spawn enemy \"" + enemyParent.enemyName + "\". EnemyDirector instance is null.");
				return null;
			}
			List<EnemyParent> list = new List<EnemyParent>();
			EnemyParent val2 = default(EnemyParent);
			foreach (GameObject sortedSpawnObject in enemySetup.GetSortedSpawnObjects())
			{
				if ((Object)(object)sortedSpawnObject == (Object)null)
				{
					Logger.LogError("Failed to spawn enemy \"" + enemyParent.enemyName + "\" spawn object. GameObject is null.");
					continue;
				}
				string enemyPrefabPath = ResourcesHelper.GetEnemyPrefabPath(sortedSpawnObject);
				GameObject val = NetworkPrefabs.SpawnNetworkPrefab(enemyPrefabPath, position, rotation, 0);
				if ((Object)(object)val == (Object)null)
				{
					Logger.LogError("Failed to spawn enemy \"" + enemyParent.enemyName + "\" spawn object \"" + ((Object)sortedSpawnObject).name + "\"");
				}
				else if (val.TryGetComponent<EnemyParent>(ref val2))
				{
					list.Add(val2);
					if (!spawnDespawned)
					{
						SpawnNextEnemiesNotDespawned++;
					}
					val2.SetupDone = true;
					Enemy componentInChildren = val.GetComponentInChildren<Enemy>();
					if ((Object)(object)componentInChildren != (Object)null)
					{
						componentInChildren.EnemyTeleported(position);
					}
					else
					{
						Logger.LogError("Enemy \"" + enemyParent.enemyName + "\" spawn object \"" + ((Object)sortedSpawnObject).name + "\" does not have an enemy component.");
					}
					LevelGenerator instance = LevelGenerator.Instance;
					instance.EnemiesSpawnTarget++;
					EnemyDirector.instance.FirstSpawnPointAdd(val2);
				}
			}
			if (list.Count == 0)
			{
				Logger.LogInfo("Failed to spawn enemy \"" + enemyParent.enemyName + "\". No spawn objects where spawned.");
				return list;
			}
			Logger.LogInfo($"Spawned enemy \"{enemyParent.enemyName}\" at position {position}", extended: true);
			RunManager.instance.EnemiesSpawnedRemoveEnd();
			return list;
		}

		public static IReadOnlyList<EnemySetup> GetEnemies()
		{
			if ((Object)(object)EnemyDirector.instance == (Object)null)
			{
				return Array.Empty<EnemySetup>();
			}
			return EnemyDirector.instance.GetEnemies();
		}

		public static bool TryGetEnemyByName(string name, [NotNullWhen(true)] out EnemySetup? enemySetup)
		{
			enemySetup = GetEnemyByName(name);
			return (Object)(object)enemySetup != (Object)null;
		}

		public static EnemySetup? GetEnemyByName(string name)
		{
			return EnemyDirector.instance?.GetEnemyByName(name);
		}

		public static bool TryGetEnemyThatContainsName(string name, [NotNullWhen(true)] out EnemySetup? enemySetup)
		{
			enemySetup = GetEnemyThatContainsName(name);
			return (Object)(object)enemySetup != (Object)null;
		}

		public static EnemySetup? GetEnemyThatContainsName(string name)
		{
			return EnemyDirector.instance?.GetEnemyThatContainsName(name);
		}
	}
	public static class Items
	{
		private static readonly List<Item> _itemsToRegister = new List<Item>();

		private static readonly List<Item> _itemsRegistered = new List<Item>();

		private static bool _initialItemsRegistered;

		public static IReadOnlyList<Item> AllItems => GetItems();

		public static IReadOnlyList<Item> RegisteredItems => _itemsRegistered;

		internal static void RegisterItems()
		{
			if ((Object)(object)StatsManager.instance == (Object)null)
			{
				Logger.LogError("Failed to register items. StatsManager instance is null.");
				return;
			}
			Logger.LogInfo("Adding items.");
			foreach (Item item in _itemsToRegister)
			{
				RegisterItemWithGame(item);
			}
			_initialItemsRegistered = true;
		}

		private static void RegisterItemWithGame(Item item)
		{
			Utilities.FixAudioMixerGroups(item.prefab);
			if (StatsManager.instance.AddItem(item))
			{
				if (!_itemsRegistered.Contains(item))
				{
					_itemsRegistered.Add(item);
				}
				Logger.LogInfo("Added item \"" + item.itemName + "\"", extended: true);
			}
			else
			{
				Logger.LogWarning("Failed to add item \"" + item.itemName + "\"", extended: true);
			}
		}

		public static void RegisterItem(Item item)
		{
			Item item2 = item;
			if ((Object)(object)item2 == (Object)null)
			{
				throw new ArgumentException("Failed to register item. Item is null.");
			}
			if ((Object)(object)item2.prefab == (Object)null)
			{
				Logger.LogError("Failed to register item \"" + item2.itemName + "\". Item prefab is null.");
				return;
			}
			if (item2.itemAssetName != ((Object)item2.prefab).name)
			{
				Logger.LogError("Failed to register item \"" + item2.itemName + "\". Item itemAssetName does not match the prefab name.");
				return;
			}
			if (ResourcesHelper.HasItemPrefab(item2))
			{
				Logger.LogError("Failed to register item \"" + item2.itemName + "\". Item prefab already exists in Resources with the same name.");
				return;
			}
			if (_itemsToRegister.Any((Item x) => x.itemAssetName == item2.itemAssetName))
			{
				Logger.LogError("Failed to register item \"" + item2.itemName + "\". Item prefab already exists with the same name.");
				return;
			}
			if (_itemsToRegister.Contains(item2))
			{
				Logger.LogError("Failed to register item \"" + item2.itemName + "\". Item is already registered!");
				return;
			}
			string itemPrefabPath = ResourcesHelper.GetItemPrefabPath(item2);
			NetworkPrefabs.RegisterNetworkPrefab(itemPrefabPath, item2.prefab);
			_itemsToRegister.Add(item2);
			if (_initialItemsRegistered)
			{
				RegisterItemWithGame(item2);
			}
		}

		public static GameObject? SpawnItem(Item item, Vector3 position, Quaternion rotation)
		{
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)item == (Object)null)
			{
				Logger.LogError("Failed to spawn item. Item is null.");
				return null;
			}
			if ((Object)(object)item.prefab == (Object)null)
			{
				Logger.LogError("Failed to spawn item. Prefab is null.");
				return null;
			}
			if (!SemiFunc.IsMasterClientOrSingleplayer())
			{
				Logger.LogError("Failed to spawn item \"" + item.itemName + "\". You are not the host.");
				return null;
			}
			string itemPrefabPath = ResourcesHelper.GetItemPrefabPath(item);
			GameObject val = NetworkPrefabs.SpawnNetworkPrefab(itemPrefabPath, position, rotation, 0);
			if ((Object)(object)val == (Object)null)
			{
				Logger.LogError("Failed to spawn item \"" + item.itemName + "\"");
				return null;
			}
			Logger.LogInfo($"Spawned item \"{item.itemName}\" at position {position}, rotation: {((Quaternion)(ref rotation)).eulerAngles}", extended: true);
			return val;
		}

		public static IReadOnlyList<Item> GetItems()
		{
			if ((Object)(object)StatsManager.instance == (Object)null)
			{
				return Array.Empty<Item>();
			}
			return StatsManager.instance.GetItems();
		}

		public static bool TryGetItemByName(string name, [NotNullWhen(true)] out Item? item)
		{
			item = GetItemByName(name);
			return (Object)(object)item != (Object)null;
		}

		public static Item? GetItemByName(string name)
		{
			return StatsManager.instance?.GetItemByName(name);
		}

		public static bool TryGetItemThatContainsName(string name, [NotNullWhen(true)] out Item? item)
		{
			item = GetItemThatContainsName(name);
			return (Object)(object)item != (Object)null;
		}

		public static Item? GetItemThatContainsName(string name)
		{
			return StatsManager.instance?.GetItemThatContainsName(name);
		}
	}
	public static class Levels
	{
		private static readonly List<Level> _levelsToRegister = new List<Level>();

		private static readonly List<Level> _levelsRegistered = new List<Level>();

		private static bool _initialLevelsRegistered;

		public static IReadOnlyList<Level> AllLevels => GetLevels();

		public static IReadOnlyList<Level> RegisteredLevels => _levelsRegistered;

		internal static void RegisterInitialLevels()
		{
			if (_initialLevelsRegistered)
			{
				return;
			}
			ValuablePresets.CacheValuablePresets();
			Logger.LogInfo("Adding levels.");
			foreach (Level item in _levelsToRegister)
			{
				RegisterLevelWithGame(item);
			}
			_levelsToRegister.Clear();
			_initialLevelsRegistered = true;
		}

		private static void RegisterLevelWithGame(Level level)
		{
			if (_levelsRegistered.Contains(level))
			{
				return;
			}
			if (level.ValuablePresets.Count == 0)
			{
				Logger.LogWarning("Level \"" + ((Object)level).name + "\" does not have any valuable presets! Adding generic preset.");
				level.ValuablePresets.Add(ValuablePresets.GenericPreset);
			}
			for (int i = 0; i < level.ValuablePresets.Count; i++)
			{
				LevelValuables val = level.ValuablePresets[i];
				if (ValuablePresets.AllValuablePresets.Values.Contains(val))
				{
					continue;
				}
				if (ValuablePresets.AllValuablePresets.TryGetValue(((Object)val).name, out LevelValuables value))
				{
					if (val.GetCombinedList().Count > 0)
					{
						Logger.LogWarning("Proxy preset \"" + ((Object)val).name + "\" in level \"" + ((Object)level).name + "\" contains valuables! This likely caused duplicate valuables to load!");
					}
					level.ValuablePresets[i] = value;
					Logger.LogInfo("Replaced proxy preset \"" + ((Object)val).name + "\" in level \"" + ((Object)level).name + "\".", extended: true);
				}
				else
				{
					ValuablePresets.RegisterValuablePreset(val);
					Logger.LogInfo("Registered valuable preset \"" + ((Object)val).name + "\" from \"" + ((Object)level).name + "\".", extended: true);
				}
			}
			RunManager.instance.levels.Add(level);
			Logger.LogInfo("Added level \"" + ((Object)level).name + "\"", extended: true);
			_levelsRegistered.Add(level);
		}

		public static void RegisterLevel(Level level)
		{
			Level level2 = level;
			if ((Object)(object)level2 == (Object)null)
			{
				Logger.LogError("Failed to register level. Level is null.");
				return;
			}
			if (_levelsToRegister.Any((Level x) => ((Object)x).name.Equals(((Object)level2).name, StringComparison.OrdinalIgnoreCase)))
			{
				Logger.LogError("Failed to register level \"" + ((Object)level2).name + "\". Level already exists with the same name.");
				return;
			}
			if (_levelsToRegister.Contains(level2))
			{
				Logger.LogWarning("Failed to register level \"" + ((Object)level2).name + "\". Level is already registered!");
				return;
			}
			List<(GameObject, ResourcesHelper.LevelPrefabType)> list2 = (from prefab in new List<GameObject>[12]
				{
					level2.ModulesExtraction1, level2.ModulesExtraction2, level2.ModulesExtraction3, level2.ModulesNormal1, level2.ModulesNormal2, level2.ModulesNormal3, level2.ModulesPassage1, level2.ModulesPassage2, level2.ModulesPassage3, level2.ModulesDeadEnd1,
					level2.ModulesDeadEnd2, level2.ModulesDeadEnd3
				}.SelectMany((List<GameObject> list) => list)
				select (prefab, ResourcesHelper.LevelPrefabType.Module)).ToList();
			foreach (GameObject startRoom in level2.StartRooms)
			{
				list2.Add((startRoom, ResourcesHelper.LevelPrefabType.StartRoom));
			}
			if ((Object)(object)level2.ConnectObject != (Object)null)
			{
				list2.Add((level2.ConnectObject, ResourcesHelper.LevelPrefabType.Other));
			}
			if ((Object)(object)level2.BlockObject != (Object)null)
			{
				list2.Add((level2.BlockObject, ResourcesHelper.LevelPrefabType.Other));
			}
			foreach (var item3 in list2)
			{
				GameObject item = item3.Item1;
				ResourcesHelper.LevelPrefabType item2 = item3.Item2;
				string levelPrefabPath = ResourcesHelper.GetLevelPrefabPath(level2, item, item2);
				if (!ResourcesHelper.HasPrefab(levelPrefabPath))
				{
					NetworkPrefabs.RegisterNetworkPrefab(levelPrefabPath, item);
					Utilities.FixAudioMixerGroups(item);
				}
			}
			if (_initialLevelsRegistered)
			{
				RegisterLevelWithGame(level2);
			}
			else
			{
				_levelsToRegister.Add(level2);
			}
		}

		public static IReadOnlyList<Level> GetLevels()
		{
			if ((Object)(object)RunManager.instance == (Object)null)
			{
				return Array.Empty<Level>();
			}
			return RunManager.instance.levels;
		}

		public static bool TryGetLevelByName(string name, [NotNullWhen(true)] out Level? level)
		{
			level = GetLevelByName(name);
			return (Object)(object)level != (Object)null;
		}

		public static Level? GetLevelByName(string name)
		{
			foreach (Level level in GetLevels())
			{
				if (((Object)level).name.EqualsAny(new <>z__ReadOnlyArray<string>(new string[2]
				{
					name,
					"Level - " + name
				}), StringComparison.OrdinalIgnoreCase))
				{
					return level;
				}
			}
			return null;
		}

		public static bool TryGetLevelThatContainsName(string name, [NotNullWhen(true)] out Level? level)
		{
			level = GetLevelThatContainsName(name);
			return (Object)(object)level != (Object)null;
		}

		public static Level? GetLevelThatContainsName(string name)
		{
			foreach (Level level in GetLevels())
			{
				if (((Object)level).name.Contains(name, StringComparison.OrdinalIgnoreCase))
				{
					return level;
				}
			}
			return null;
		}
	}
	public static class NetworkingEvents
	{
		public static readonly byte[] ReservedEventCodes = new byte[3] { 0, 1, 2 };

		private static readonly List<NetworkedEvent> _customEvents = new List<NetworkedEvent>();

		public static readonly RaiseEventOptions RaiseAll = new RaiseEventOptions
		{
			Receivers = (ReceiverGroup)1
		};

		public static readonly RaiseEventOptions RaiseOthers = new RaiseEventOptions
		{
			Receivers = (ReceiverGroup)0
		};

		public static readonly RaiseEventOptions RaiseMasterClient = new RaiseEventOptions
		{
			Receivers = (ReceiverGroup)2
		};

		public static IReadOnlyList<NetworkedEvent> CustomEvents => _customEvents;

		internal static void Initialize()
		{
			PhotonNetwork.NetworkingClient.EventReceived += OnEvent;
			Application.quitting += delegate
			{
				PhotonNetwork.NetworkingClient.EventReceived -= OnEvent;
			};
		}

		internal static void AddCustomEvent(NetworkedEvent networkedEvent)
		{
			if (!_customEvents.Contains(networkedEvent))
			{
				_customEvents.Add(networkedEvent);
			}
		}

		private static void OnEvent(EventData photonEvent)
		{
			EventData photonEvent2 = photonEvent;
			_customEvents.FirstOrDefault((NetworkedEvent e) => e.EventCode == photonEvent2.Code)?.EventAction?.Invoke(photonEvent2);
		}

		internal static bool TryGetUniqueEventCode(out byte eventCode)
		{
			eventCode = 0;
			while (IsEventCodeTaken(eventCode) && eventCode < 200)
			{
				eventCode++;
			}
			if (eventCode > 200 || (eventCode == 200 && IsEventCodeTaken(eventCode)))
			{
				eventCode = 0;
				return false;
			}
			return true;
		}

		public static bool IsEventCodeTaken(byte eventCode)
		{
			if (ReservedEventCodes.Any((byte x) => x == eventCode))
			{
				return true;
			}
			if (_customEvents.Any((NetworkedEvent x) => x.EventCode == eventCode))
			{
				return true;
			}
			return false;
		}
	}
	public class NetworkedEvent
	{
		public string Name { get; private set; }

		public byte EventCode { get; private set; }

		public Action<EventData> EventAction { get; private set; }

		public NetworkedEvent(string name, Action<EventData> eventAction)
		{
			Name = name;
			EventAction = eventAction;
			if (NetworkingEvents.TryGetUniqueEventCode(out var eventCode))
			{
				EventCode = eventCode;
				NetworkingEvents.AddCustomEvent(this);
				Logger.LogInfo($"Registered NetworkedEvent \"{Name}\" with event code: {EventCode}", extended: true);
			}
			else
			{
				Logger.LogError("Failed to register NetworkedEvent \"" + Name + "\". Could not get unique event code.");
			}
		}

		public void RaiseEvent(object eventContent, RaiseEventOptions raiseEventOptions, SendOptions sendOptions)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			if (SemiFunc.IsMultiplayer())
			{
				PhotonNetwork.RaiseEvent(EventCode, eventContent, raiseEventOptions, sendOptions);
			}
			else if ((int)raiseEventOptions.Receivers != 0)
			{
				RaiseEventSingleplayer(eventContent);
			}
		}

		private void RaiseEventSingleplayer(object eventContent)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Expected O, but got Unknown
			if (!SemiFunc.IsMultiplayer())
			{
				EventData val = new EventData
				{
					Code = EventCode
				};
				val.Parameters[val.CustomDataKey] = eventContent;
				val.Parameters[val.SenderKey] = 1;
				EventAction?.Invoke(val);
			}
		}
	}
	public static class NetworkPrefabs
	{
		private static CustomPrefabPool? _customPrefabPool;

		internal static CustomPrefabPool CustomPrefabPool
		{
			get
			{
				if (_customPrefabPool == null)
				{
					_customPrefabPool = new CustomPrefabPool();
				}
				return _customPrefabPool;
			}
			private set
			{
				_customPrefabPool = value;
			}
		}

		internal static void Initialize()
		{
			if (PhotonNetwork.PrefabPool is CustomPrefabPool)
			{
				Logger.LogWarning("NetworkPrefabs failed to initialize. PhotonNetwork.PrefabPool is already a CustomPrefabPool.");
				return;
			}
			Logger.LogInfo("Initializing NetworkPrefabs.");
			Logger.LogDebug($"PhotonNetwork.PrefabPool = {((object)PhotonNetwork.PrefabPool).GetType()}");
			IPunPrefabPool prefabPool = PhotonNetwork.PrefabPool;
			DefaultPool val = (DefaultPool)(object)((prefabPool is DefaultPool) ? prefabPool : null);
			if (val != null)
			{
				CustomPrefabPool.DefaultPool = val;
			}
			else if (!(PhotonNetwork.PrefabPool is CustomPrefabPool))
			{
				Logger.LogWarning($"PhotonNetwork has an unknown prefab pool assigned. PhotonNetwork.PrefabPool = {((object)PhotonNetwork.PrefabPool).GetType()}");
			}
			PhotonNetwork.PrefabPool = (IPunPrefabPool)(object)CustomPrefabPool;
			Logger.LogInfo("Replaced PhotonNetwork.PrefabPool with CustomPrefabPool.");
			Logger.LogDebug($"PhotonNetwork.PrefabPool = {((object)PhotonNetwork.PrefabPool).GetType()}");
			Logger.LogInfo("Finished initializing NetworkPrefabs.");
		}

		public static void RegisterNetworkPrefab(GameObject prefab)
		{
			RegisterNetworkPrefab((prefab != null) ? ((Object)prefab).name : null, prefab);
		}

		public static void RegisterNetworkPrefab(string prefabId, GameObject prefab)
		{
			CustomPrefabPool.RegisterPrefab(prefabId, prefab);
		}

		public static bool HasNetworkPrefab(string prefabId)
		{
			return CustomPrefabPool.HasPrefab(prefabId);
		}

		public static GameObject? GetNetworkPrefab(string prefabId)
		{
			return CustomPrefabPool.GetPrefab(prefabId);
		}

		public static bool TryGetNetworkPrefab(string prefabId, [NotNullWhen(true)] out GameObject? prefab)
		{
			prefab = GetNetworkPrefab(prefabId);
			return (Object)(object)prefab != (Object)null;
		}

		public static GameObject? SpawnNetworkPrefab(string prefabId, Vector3 position, Quaternion rotation, byte group = 0, object[]? data = null)
		{
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			if (string.IsNullOrWhiteSpace(prefabId))
			{
				Logger.LogError("Failed to spawn network prefab. PrefabId is null.");
				return null;
			}
			if (!HasNetworkPrefab(prefabId))
			{
				Logger.LogError("Failed to spawn network prefab \"" + prefabId + "\". PrefabId is not registered as a network prefab.");
				return null;
			}
			if (!SemiFunc.IsMasterClientOrSingleplayer())
			{
				Logger.LogError("Failed to spawn network prefab \"" + prefabId + "\". You are not the host.");
				return null;
			}
			if (SemiFunc.IsMultiplayer())
			{
				return PhotonNetwork.InstantiateRoomObject(prefabId, position, rotation, group, data);
			}
			return Object.Instantiate<GameObject>(CustomPrefabPool.GetPrefab(prefabId), position, rotation);
		}
	}
	public static class ResourcesHelper
	{
		public enum LevelPrefabType
		{
			Module,
			Other,
			StartRoom
		}

		public static string GetValuablesFolderPath(Type volumeType)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Expected I4, but got Unknown
			return "Valuables/" + (int)volumeType switch
			{
				0 => "01 Tiny", 
				1 => "02 Small", 
				2 => "03 Medium", 
				3 => "04 Big", 
				4 => "05 Wide", 
				5 => "06 Tall", 
				6 => "07 Very Tall", 
				_ => string.Empty, 
			};
		}

		public static string GetItemsFolderPath()
		{
			return "Items";
		}

		public static string GetEnemiesFolderPath()
		{
			return "Enemies";
		}

		public static string GetLevelPrefabsFolderPath(Level level, LevelPrefabType type)
		{
			string text = type switch
			{
				LevelPrefabType.Module => "Modules", 
				LevelPrefabType.Other => "Other", 
				LevelPrefabType.StartRoom => "Start Room", 
				_ => string.Empty, 
			};
			return "Level/" + level.ResourcePath + "/" + text;
		}

		public static string GetValuablePrefabPath(ValuableObject valuableObject)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)valuableObject == (Object)null)
			{
				return string.Empty;
			}
			string valuablesFolderPath = GetValuablesFolderPath(valuableObject.volumeType);
			return valuablesFolderPath + "/" + ((Object)((Component)valuableObject).gameObject).name;
		}

		public static string GetValuablePrefabPath(GameObject prefab)
		{
			if ((Object)(object)prefab == (Object)null)
			{
				return string.Empty;
			}
			ValuableObject valuableObject = default(ValuableObject);
			if (prefab.TryGetComponent<ValuableObject>(ref valuableObject))
			{
				return GetValuablePrefabPath(valuableObject);
			}
			return string.Empty;
		}

		public static string GetItemPrefabPath(Item item)
		{
			if ((Object)(object)item == (Object)null)
			{
				return string.Empty;
			}
			return GetItemPrefabPath(item.prefab);
		}

		public static string GetItemPrefabPath(GameObject prefab)
		{
			if ((Object)(object)prefab == (Object)null)
			{
				return string.Empty;
			}
			string itemsFolderPath = GetItemsFolderPath();
			return itemsFolderPath + "/" + ((Object)prefab).name;
		}

		public static string GetEnemyPrefabPath(EnemySetup enemySetup)
		{
			if ((Object)(object)enemySetup == (Object)null || enemySetup.spawnObjects == null)
			{
				return string.Empty;
			}
			GameObject mainSpawnObject = enemySetup.GetMainSpawnObject();
			if ((Object)(object)mainSpawnObject == (Object)null)
			{
				return string.Empty;
			}
			string enemiesFolderPath = GetEnemiesFolderPath();
			return enemiesFolderPath + "/" + ((Object)mainSpawnObject).name;
		}

		public static string GetEnemyPrefabPath(GameObject prefab)
		{
			if ((Object)(object)prefab == (Object)null)
			{
				return string.Empty;
			}
			string enemiesFolderPath = GetEnemiesFolderPath();
			return enemiesFolderPath + "/" + ((Object)prefab).name;
		}

		public static string GetLevelPrefabPath(Level level, GameObject prefab, LevelPrefabType type)
		{
			if ((Object)(object)prefab == (Object)null)
			{
				return string.Empty;
			}
			string levelPrefabsFolderPath = GetLevelPrefabsFolderPath(level, type);
			return levelPrefabsFolderPath + "/" + ((Object)prefab).name;
		}

		public static bool HasValuablePrefab(ValuableObject valuableObject)
		{
			if ((Object)(object)valuableObject == (Object)null)
			{
				return false;
			}
			string valuablePrefabPath = GetValuablePrefabPath(valuableObject);
			return (Object)(object)Resources.Load<GameObject>(valuablePrefabPath) != (Object)null;
		}

		public static bool HasItemPrefab(Item item)
		{
			if ((Object)(object)item == (Object)null)
			{
				return false;
			}
			string itemPrefabPath = GetItemPrefabPath(item);
			return (Object)(object)Resources.Load<GameObject>(itemPrefabPath) != (Object)null;
		}

		public static bool HasEnemyPrefab(EnemySetup enemySetup)
		{
			if ((Object)(object)enemySetup == (Object)null)
			{
				return false;
			}
			foreach (GameObject distinctSpawnObject in enemySetup.GetDistinctSpawnObjects())
			{
				string enemyPrefabPath = GetEnemyPrefabPath(distinctSpawnObject);
				if ((Object)(object)Resources.Load<GameObject>(enemyPrefabPath) != (Object)null)
				{
					return true;
				}
			}
			return false;
		}

		public static bool HasPrefab(GameObject prefab)
		{
			return (Object)(object)Resources.Load<GameObject>((prefab != null) ? ((Object)prefab).name : null) != (Object)null;
		}

		public static bool HasPrefab(string prefabId)
		{
			return (Object)(object)Resources.Load<GameObject>(prefabId) != (Object)null;
		}
	}
	public static class Upgrades
	{
		private static readonly Dictionary<string, PlayerUpgrade> _playerUpgrades = new Dictionary<string, PlayerUpgrade>();

		private static NetworkedEvent? _upgradeEvent;

		public static IReadOnlyList<PlayerUpgrade> PlayerUpgrades => _playerUpgrades.Values.ToList();

		internal static void Initialize()
		{
			_upgradeEvent = new NetworkedEvent("REPOLib Upgrade", HandleUpgradeEvent);
		}

		internal static void RegisterUpgrades()
		{
			if ((Object)(object)StatsManager.instance == (Object)null)
			{
				Logger.LogError("Upgrades: Failed to register upgrades. StatsManager instance is null.");
				return;
			}
			foreach (KeyValuePair<string, PlayerUpgrade> playerUpgrade in _playerUpgrades)
			{
				string text = "playerUpgrade" + playerUpgrade.Key;
				Dictionary<string, int> playerDictionary = playerUpgrade.Value.PlayerDictionary;
				if (StatsManager.instance.dictionaryOfDictionaries.TryGetValue(text, out var value))
				{
					playerDictionary = value;
					Logger.LogInfo("Upgrades: Loaded upgrade \"" + text + "\" from StatsManager.", extended: true);
				}
				else
				{
					playerDictionary.Clear();
					StatsManager.instance.dictionaryOfDictionaries.Add(text, playerDictionary);
					Logger.LogInfo("Upgrades: Added upgrade \"" + text + "\" to StatsManager.", extended: true);
				}
			}
		}

		internal static void InvokeStartActions(string steamId)
		{
			PlayerAvatar val = SemiFunc.PlayerAvatarGetFromSteamID(steamId);
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			string arg = SemiFunc.PlayerGetName(val);
			foreach (PlayerUpgrade playerUpgrade in PlayerUpgrades)
			{
				if (playerUpgrade.StartAction != null)
				{
					try
					{
						int level = playerUpgrade.GetLevel(steamId);
						playerUpgrade.StartAction(val, level);
						Logger.LogDebug($"Upgrades: Invoked start action for upgrade \"{playerUpgrade.UpgradeId}\" on player \"{arg}\" at level {level}");
					}
					catch (Exception arg2)
					{
						Logger.LogError($"Upgrades: Failed to invoke start action for upgrade \"{playerUpgrade.UpgradeId}\" on player \"{arg}\". {arg2}");
					}
				}
			}
		}

		internal static void RaiseUpgradeEvent(string upgradeId, string steamId, int level)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Expected O, but got Unknown
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Expected O, but got Unknown
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_0037: Expected O, but got Unknown
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			if (_upgradeEvent != null)
			{
				Hashtable val = new Hashtable();
				((Dictionary<object, object>)val).Add((object)"UpgradeId", (object)upgradeId);
				((Dictionary<object, object>)val).Add((object)"SteamId", (object)steamId);
				((Dictionary<object, object>)val).Add((object)"Level", (object)level);
				Hashtable eventContent = val;
				_upgradeEvent.RaiseEvent(eventContent, NetworkingEvents.RaiseOthers, SendOptions.SendReliable);
			}
		}

		private static void HandleUpgradeEvent(EventData eventData)
		{
			object customData = eventData.CustomData;
			Hashtable val = (Hashtable)((customData is Hashtable) ? customData : null);
			if (val != null)
			{
				string upgradeId = (string)val[(object)"UpgradeId"];
				string steamId = (string)val[(object)"SteamId"];
				int level = (int)val[(object)"Level"];
				if (TryGetUpgrade(upgradeId, out PlayerUpgrade playerUpgrade))
				{
					playerUpgrade.ApplyUpgrade(steamId, level);
				}
			}
		}

		public static PlayerUpgrade? RegisterUpgrade(string upgradeId, Item? item, Action<PlayerAvatar, int>? startAction, Action<PlayerAvatar, int>? upgradeAction)
		{
			if (_playerUpgrades.ContainsKey(upgradeId))
			{
				Logger.LogError("Failed to register upgrade \"" + upgradeId + "\". An upgrade with this UpgradeId has already been registered.");
				return null;
			}
			PlayerUpgrade playerUpgrade = new PlayerUpgrade(upgradeId, item, startAction, upgradeAction);
			_playerUpgrades.Add(upgradeId, playerUpgrade);
			return playerUpgrade;
		}

		public static PlayerUpgrade? GetUpgrade(string upgradeId)
		{
			if (_playerUpgrades.TryGetValue(upgradeId, out PlayerUpgrade value))
			{
				return value;
			}
			return null;
		}

		public static bool TryGetUpgrade(string upgradeId, [NotNullWhen(true)] out PlayerUpgrade? playerUpgrade)
		{
			playerUpgrade = GetUpgrade(upgradeId);
			return playerUpgrade != null;
		}
	}
	public class PlayerUpgrade
	{
		public readonly string UpgradeId;

		public readonly Item? Item;

		public Dictionary<string, int> PlayerDictionary = new Dictionary<string, int>();

		internal readonly Action<PlayerAvatar, int>? StartAction;

		private readonly Action<PlayerAvatar, int>? _upgradeAction;

		internal PlayerUpgrade(string upgradeId, Item? item, Action<PlayerAvatar, int>? startAction, Action<PlayerAvatar, int>? upgradeAction)
		{
			UpgradeId = upgradeId;
			Item = item;
			StartAction = startAction;
			_upgradeAction = upgradeAction;
		}

		public int GetLevel(PlayerAvatar playerAvatar)
		{
			if ((Object)(object)playerAvatar == (Object)null)
			{
				return 0;
			}
			return GetLevel(playerAvatar.steamID);
		}

		public int GetLevel(string steamId)
		{
			if (PlayerDictionary.TryGetValue(steamId, out var value))
			{
				return value;
			}
			return 0;
		}

		public int AddLevel(PlayerAvatar playerAvatar, int amount = 1)
		{
			if ((Object)(object)playerAvatar == (Object)null)
			{
				return 0;
			}
			return AddLevel(playerAvatar.steamID, amount);
		}

		public int AddLevel(string steamId, int amount = 1)
		{
			return ChangeLevelBy(steamId, amount);
		}

		public int RemoveLevel(PlayerAvatar playerAvatar, int amount = 1)
		{
			if ((Object)(object)playerAvatar == (Object)null)
			{
				return 0;
			}
			return RemoveLevel(playerAvatar.steamID, amount);
		}

		public int RemoveLevel(string steamId, int amount = 1)
		{
			return ChangeLevelBy(steamId, -amount);
		}

		public int SetLevel(PlayerAvatar playerAvatar, int level)
		{
			if ((Object)(object)playerAvatar == (Object)null)
			{
				return 0;
			}
			return SetLevel(playerAvatar.steamID, level);
		}

		public int SetLevel(string steamId, int level)
		{
			level = Mathf.Max(level, 0);
			PlayerDictionary[steamId] = level;
			ApplyUpgrade(steamId, level);
			Upgrades.RaiseUpgradeEvent(UpgradeId, steamId, level);
			return level;
		}

		private int ChangeLevelBy(string steamId, int amount)
		{
			int level = GetLevel(steamId);
			level += amount;
			return SetLevel(steamId, level);
		}

		internal void ApplyUpgrade(string steamId, int level)
		{
			PlayerDictionary[steamId] = level;
			if (_upgradeAction == null)
			{
				return;
			}
			PlayerAvatar val = SemiFunc.PlayerAvatarGetFromSteamID(steamId);
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			string arg = SemiFunc.PlayerGetName(val);
			try
			{
				_upgradeAction(val, GetLevel(steamId));
				Logger.LogDebug($"PlayerUpgrade: Invoked upgrade action for upgrade \"{UpgradeId}\" on player \"{arg}\" at level {level}");
			}
			catch (Exception arg2)
			{
				Logger.LogError($"PlayerUpgrade: Failed to invoke upgrade action for upgrade \"{UpgradeId}\" on player \"{arg}\". {arg2}");
			}
		}
	}
	public class REPOLibItemUpgrade : MonoBehaviour
	{
		[SerializeField]
		private string _upgradeId;

		private ItemToggle _itemToggle;

		public string UpgradeId => _upgradeId;

		private void Start()
		{
			_itemToggle = ((Component)this).GetComponent<ItemToggle>();
		}

		public void Upgrade()
		{
			if ((Object)(object)_itemToggle == (Object)null)
			{
				Logger.LogError("REPOLibItemUpgrade: Failed to upgrade \"" + UpgradeId + "\". ItemToggle is null.");
				return;
			}
			int playerTogglePhotonID = _itemToggle.playerTogglePhotonID;
			PlayerAvatar val = SemiFunc.PlayerAvatarGetFromPhotonID(playerTogglePhotonID);
			if ((Object)(object)val == (Object)null)
			{
				Logger.LogError($"REPOLibItemUpgrade: Failed to upgrade \"{UpgradeId}\". Could not find PlayerAvatar from ItemToggle's playerTogglePhotonID {playerTogglePhotonID}.");
			}
			else if (val.isLocal)
			{
				if (!Upgrades.TryGetUpgrade(UpgradeId, out PlayerUpgrade playerUpgrade))
				{
					Logger.LogError("REPOLibItemUpgrade: Failed to upgrade \"" + UpgradeId + "\". Could not find PlayerUpgrade from UpgradeId.");
				}
				else
				{
					playerUpgrade.AddLevel(val);
				}
			}
		}
	}
	public static class Utilities
	{
		private static readonly List<GameObject> _prefabsToFix = new List<GameObject>();

		private static readonly List<GameObject> _fixedPrefabs = new List<GameObject>();

		internal static void FixAudioMixerGroupsOnPrefabs()
		{
			foreach (GameObject item in _prefabsToFix)
			{
				item.FixAudioMixerGroups();
				_fixedPrefabs.Add(item);
			}
			_prefabsToFix.Clear();
		}

		public static void FixAudioMixerGroups(GameObject prefab)
		{
			if (!((Object)(object)prefab == (Object)null) && !_prefabsToFix.Contains(prefab) && !_fixedPrefabs.Contains(prefab))
			{
				if ((Object)(object)AudioManager.instance == (Object)null)
				{
					_prefabsToFix.Add(prefab);
					return;
				}
				prefab.FixAudioMixerGroups();
				_fixedPrefabs.Add(prefab);
			}
		}

		internal static void SafeInvokeEvent(Action? action)
		{
			try
			{
				action?.Invoke();
			}
			catch (Exception arg)
			{
				Logger.LogError($"Exception occured while invoking event: {arg}");
			}
		}
	}
	public static class ValuablePresets
	{
		private static readonly Dictionary<string, LevelValuables> _valuablePresets = new Dictionary<string, LevelValuables>();

		public const string GenericValuablePresetName = "Valuables - Generic";

		public static IReadOnlyDictionary<string, LevelValuables> AllValuablePresets => _valuablePresets;

		public static LevelValuables GenericPreset => AllValuablePresets["Valuables - Generic"];

		public static void CacheValuablePresets()
		{
			if ((Object)(object)RunManager.instance == (Object)null)
			{
				Logger.LogError("Failed to cache LevelValuables. RunManager instance is null.");
				return;
			}
			foreach (Level level in RunManager.instance.levels)
			{
				foreach (LevelValuables valuablePreset in level.ValuablePresets)
				{
					_valuablePresets.TryAdd(((Object)valuablePreset).name, valuablePreset);
				}
			}
		}

		internal static void RegisterValuablePreset(LevelValuables valuablePreset)
		{
			_valuablePresets.Add(((Object)valuablePreset).name, valuablePreset);
		}
	}
	public static class Valuables
	{
		private static readonly Dictionary<GameObject, List<string>> _valuablesToRegister = new Dictionary<GameObject, List<string>>();

		private static readonly List<GameObject> _valuablesRegistered = new List<GameObject>();

		private static bool _initialValuablesRegistered;

		public static IReadOnlyList<GameObject> AllValuables => GetValuables();

		public static IReadOnlyList<GameObject> RegisteredValuables => _valuablesRegistered;

		private static IEnumerable<GameObject> PendingAndRegisteredValuables => _valuablesToRegister.Keys.Concat(_valuablesRegistered);

		internal static void RegisterInitialValuables()
		{
			if (_initialValuablesRegistered)
			{
				return;
			}
			Logger.LogInfo("Adding valuables to valuable presets.");
			foreach (GameObject key in _valuablesToRegister.Keys)
			{
				RegisterValuableWithGame(key);
			}
			_valuablesToRegister.Clear();
			_initialValuablesRegistered = true;
		}

		private static void RegisterValuableWithGame(GameObject valuable)
		{
			if (_valuablesRegistered.Contains(valuable))
			{
				return;
			}
			List<string> list = _valuablesToRegister[valuable];
			if (!list.Any((string x) => ValuablePresets.AllValuablePresets.Keys.Any((string y) => x == y)))
			{
				Logger.LogWarning("Valuable \"" + ((Object)valuable).name + "\" does not have any valid valuable preset names set. Adding generic valuable preset name.");
				list.Add("Valuables - Generic");
			}
			foreach (string item in list)
			{
				if (item == null || !ValuablePresets.AllValuablePresets.ContainsKey(item))
				{
					Logger.LogWarning("Failed to add valuable \"" + ((Object)valuable).name + "\" to valuable preset \"" + item + "\". The valuable preset does not exist.");
				}
				else if (ValuablePresets.AllValuablePresets[item].AddValuable(valuable))
				{
					_valuablesRegistered.Add(valuable);
					Logger.LogDebug("Added valuable \"" + ((Object)valuable).name + "\" to valuable preset \"" + item + "\"");
				}
				else
				{
					Logger.LogWarning("Failed to add valuable \"" + ((Object)valuable).name + "\" to valuable preset \"" + item + "\"", extended: true);
				}
			}
		}

		public static void RegisterValuable(GameObject prefab)
		{
			RegisterValuable(prefab, new List<string>());
		}

		public static void RegisterValuable(GameObject prefab, List<LevelValuables> presets)
		{
			RegisterValuable(prefab, presets.Select((LevelValuables preset) => ((Object)preset).name).ToList());
		}

		public static void RegisterValuable(GameObject prefab, List<string> presetNames)
		{
			ValuableObject valuableObject = default(ValuableObject);
			if ((Object)(object)prefab == (Object)null)
			{
				Logger.LogError("Failed to register valuable. Prefab is null.");
			}
			else if (!prefab.TryGetComponent<ValuableObject>(ref valuableObject))
			{
				Logger.LogError("Failed to register valuable. Prefab does not have a ValuableObject component.");
			}
			else
			{
				RegisterValuable(valuableObject, presetNames);
			}
		}

		public static void RegisterValuable(ValuableObject valuableObject)
		{
			RegisterValuable(valuableObject, new List<string>());
		}

		public static void RegisterValuable(ValuableObject valuableObject, List<LevelValuables> presets)
		{
			RegisterValuable(valuableObject, presets.Select((LevelValuables preset) => ((Object)preset).name).ToList());
		}

		public static void RegisterValuable(ValuableObject valuableObject, List<string> presetNames)
		{
			if ((Object)(object)valuableObject == (Object)null)
			{
				Logger.LogError("Failed to register valuable. ValuableObject is null.");
				return;
			}
			GameObject prefab = ((Component)valuableObject).gameObject;
			if (presetNames == null || presetNames.Count == 0)
			{
				Logger.LogWarning("Valuable \"" + ((Object)valuableObject).name + "\" does not have any valid valuable preset names set. Adding generic valuable preset name.", extended: true);
				presetNames = new List<string>(1) { "Valuables - Generic" };
			}
			if (ResourcesHelper.HasValuablePrefab(valuableObject))
			{
				Logger.LogError("Failed to register valuable \"" + ((Object)prefab).name + "\". Valuable prefab already exists in Resources with the same name.");
				return;
			}
			if (PendingAndRegisteredValuables.Any((GameObject x) => ((Object)x).name.Equals(((Object)prefab).name, StringComparison.OrdinalIgnoreCase)))
			{
				Logger.LogError("Failed to register valuable \"" + ((Object)prefab).name + "\". Valuable prefab already exists with the same name.");
				return;
			}
			if (PendingAndRegisteredValuables.Contains(prefab))
			{
				Logger.LogWarning("Failed to register valuable \"" + ((Object)prefab).name + "\". Valuable is already registered!");
				return;
			}
			string valuablePrefabPath = ResourcesHelper.GetValuablePrefabPath(valuableObject);
			NetworkPrefabs.RegisterNetworkPrefab(valuablePrefabPath, prefab);
			Utilities.FixAudioMixerGroups(prefab);
			_valuablesToRegister.Add(prefab, presetNames);
			if (_initialValuablesRegistered)
			{
				RegisterValuableWithGame(((Component)valuableObject).gameObject);
			}
		}

		public static GameObject? SpawnValuable(ValuableObject valuableObject, Vector3 position, Quaternion rotation)
		{
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)valuableObject == (Object)null)
			{
				Logger.LogError("Failed to spawn valuable. ValuableObject is null.");
				return null;
			}
			if (!SemiFunc.IsMasterClientOrSingleplayer())
			{
				Logger.LogError("Failed to spawn valuable \"" + ((Object)((Component)valuableObject).gameObject).name + "\". You are not the host.");
				return null;
			}
			string valuablePrefabPath = ResourcesHelper.GetValuablePrefabPath(valuableObject);
			GameObject val = NetworkPrefabs.SpawnNetworkPrefab(valuablePrefabPath, position, rotation, 0);
			if ((Object)(object)val == (Object)null)
			{
				Logger.LogError("Failed to spawn valuable \"" + ((Object)((Component)valuableObject).gameObject).name + "\"");
				return null;
			}
			Logger.LogInfo($"Spawned valuable \"{((Object)val).name}\" at position {position}, rotation: {((Quaternion)(ref rotation)).eulerAngles}", extended: true);
			return val;
		}

		public static IReadOnlyList<GameObject> GetValuables()
		{
			if ((Object)(object)RunManager.instance == (Object)null)
			{
				return Array.Empty<GameObject>();
			}
			return ValuablePresets.AllValuablePresets.Values.Select((LevelValuables levelValuables) => levelValuables.GetCombinedList()).SelectMany((List<GameObject> list) => list).Distinct()
				.ToList();
		}

		public static bool TryGetValuableByName(string name, [NotNullWhen(true)] out ValuableObject? valuableObject)
		{
			valuableObject = GetValuableByName(name);
			return (Object)(object)valuableObject != (Object)null;
		}

		public static ValuableObject? GetValuableByName(string name)
		{
			string name2 = name;
			GameObject val = ((IEnumerable<GameObject>)GetValuables()).FirstOrDefault((Func<GameObject, bool>)((GameObject x) => ((Object)x).name.Equals(name2, StringComparison.OrdinalIgnoreCase)));
			return ((val != null) ? val.GetComponent<ValuableObject>() : null) ?? null;
		}

		public static bool TryGetValuableThatContainsName(string name, [NotNullWhen(true)] out ValuableObject? valuableObject)
		{
			valuableObject = GetValuableThatContainsName(name);
			return (Object)(object)valuableObject != (Object)null;
		}

		public static ValuableObject? GetValuableThatContainsName(string name)
		{
			string name2 = name;
			GameObject val = GetValuables().SortByStringLength((GameObject x) => ((Object)x).name, ListExtensions.StringSortMode.Shortest).FirstOrDefault((Func<GameObject, bool>)((GameObject x) => ((Object)x).name.Contains(name2, StringComparison.OrdinalIgnoreCase)));
			return ((val != null) ? val.GetComponent<ValuableObject>() : null) ?? null;
		}

		[Obsolete("prefabId is no longer supported", true)]
		public static void RegisterValuable(string prefabId, GameObject prefab)
		{
			RegisterValuable(prefab);
		}

		[Obsolete("prefabId is no longer supported", true)]
		public static void RegisterValuable(string prefabId, GameObject prefab, List<LevelValuables> presets)
		{
			RegisterValuable(prefab, presets);
		}

		[Obsolete("prefabId is no longer supported", true)]
		public static void RegisterValuable(string prefabId, GameObject prefab, List<string> presetNames)
		{
			RegisterValuable(prefab, presetNames);
		}
	}
}
namespace REPOLib.Extensions
{
	internal static class AudioSourceExtensions
	{
		public static void FixAudioMixerGroup(this AudioSource audioSource)
		{
			audioSource.FixAudioMixerGroup(((Component)audioSource).gameObject);
		}

		public static void FixAudioMixerGroup(this AudioSource audioSource, GameObject rootObject)
		{
			if ((Object)(object)audioSource == (Object)null)
			{
				return;
			}
			string text = ((!((Object)(object)rootObject == (Object)(object)((Component)audioSource).gameObject)) ? (((Object)rootObject).name + "/" + ((Object)((Component)audioSource).gameObject).name) : ((Object)((Component)audioSource).gameObject).name);
			if ((Object)(object)AudioManager.instance == (Object)null)
			{
				Logger.LogWarning("Failed to fix AudioMixerGroup on GameObject \"" + text + "\". AudioManager instance is null.");
				return;
			}
			if ((Object)(object)audioSource.outputAudioMixerGroup == (Object)null)
			{
				Logger.LogWarning("Failed to fix AudioMixerGroup on GameObject \"" + text + "\". No AudioMixerGroup is assigned.");
				return;
			}
			AudioMixer val = (AudioMixer)(((Object)audioSource.outputAudioMixerGroup.audioMixer).name switch
			{
				"Master" => AudioManager.instance.MasterMixer, 
				"Music" => AudioManager.instance.MusicMasterGroup.audioMixer, 
				"Sound" => AudioManager.instance.SoundMasterGroup.audioMixer, 
				"Spectate" => AudioManager.instance.MicrophoneSpectateGroup.audioMixer, 
				_ => AudioManager.instance.SoundMasterGroup.audioMixer, 
			});
			AudioMixerGroup[] array = val.FindMatchingGroups(((Object)audioSource.outputAudioMixerGroup).name);
			AudioMixerGroup val2;
			if (array.Length >= 1)
			{
				val2 = array[0];
			}
			else
			{
				val = AudioManager.instance.SoundMasterGroup.audioMixer;
				val2 = val.FindMatchingGroups("Sound Effects")[0];
				Logger.LogWarning("Could not find matching AudioMixerGroup for GameObject \"" + text + "\". Using default AudioMixerGroup \"" + ((Object)val).name + "/" + ((Object)val2).name + "\"", extended: true);
			}
			audioSource.outputAudioMixerGroup = val2;
			Logger.LogDebug("Fixed AudioMixerGroup on GameObject \"" + text + "\". AudioMixerGroup \"" + ((Object)val).name + "/" + ((Object)val2).name + "\"");
		}
	}
	internal static class DictionaryExtensions
	{
		public static bool TryGetKey<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, TValue value, [NotNullWhen(true)] out TKey? key)
		{
			foreach (KeyValuePair<TKey, TValue> item in dictionary)
			{
				if (object.Equals(item.Value, value))
				{
					key = item.Key;
					return true;
				}
			}
			key = default(TKey);
			return false;
		}

		public static TKey? GetKeyOrDefault<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, TValue value)
		{
			if (dictionary.TryGetKey(value, out TKey key))
			{
				return key;
			}
			return default(TKey);
		}

		public static TKey? GetKeyOrDefault<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, TValue value, TKey defaultKey)
		{
			if (dictionary.TryGetKey(value, out TKey key))
			{
				return key;
			}
			return defaultKey;
		}

		public static bool ContainsKey<T>(this Dictionary<string, T> dictionary, string key, bool ignoreKeyCase)
		{
			if (!ignoreKeyCase)
			{
				return dictionary.ContainsKey(key);
			}
			foreach (KeyValuePair<string, T> item in dictionary)
			{
				if (string.Equals(item.Key, key, StringComparison.OrdinalIgnoreCase))
				{
					return true;
				}
			}
			return false;
		}

		public static bool TryGetValue<T>(this Dictionary<string, T> dictionary, string key, [NotNullWhen(true)] out T? value, bool ignoreKeyCase)
		{
			if (!ignoreKeyCase)
			{
				return dictionary.TryGetValue(key, out value);
			}
			foreach (KeyValuePair<string, T> item in dictionary)
			{
				if (string.Equals(item.Key, key, StringComparison.OrdinalIgnoreCase))
				{
					value = item.Value;
					return true;
				}
			}
			value = default(T);
			return false;
		}

		public static T? GetValueOrDefault<T>(this Dictionary<string, T> dictionary, string key, bool ignoreKeyCase)
		{
			if (dictionary.TryGetValue(key, out T value, ignoreKeyCase))
			{
				return value;
			}
			return default(T);
		}

		public static T? GetValueOrDefault<T>(this Dictionary<string, T> dictionary, string key, T defaultValue, bool ignoreKeyCase)
		{
			if (dictionary.TryGetValue(key, out T value, ignoreKeyCase))
			{
				return value;
			}
			return defaultValue;
		}
	}
	internal static class EnemyDirectorExtensions
	{
		public static bool HasEnemy(this EnemyDirector enemyDirector, EnemySetup enemySetup)
		{
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)enemySetup == (Object)null || enemySetup.spawnObjects.Count == 0)
			{
				return false;
			}
			EnemyParent val = default(EnemyParent);
			foreach (GameObject spawnObject in enemySetup.spawnObjects)
			{
				if (spawnObject.TryGetComponent<EnemyParent>(ref val) && enemyDirector.TryGetList(val.difficulty, out List<EnemySetup> list))
				{
					return list.Contains(enemySetup);
				}
			}
			return false;
		}

		internal static bool AddEnemy(this EnemyDirector enemyDirector, EnemySetup enemySetup)
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)enemySetup == (Object)null)
			{
				return false;
			}
			EnemyParent val = default(EnemyParent);
			foreach (GameObject spawnObject in enemySetup.spawnObjects)
			{
				if (spawnObject.TryGetComponent<EnemyParent>(ref val) && enemyDirector.TryGetList(val.difficulty, out List<EnemySetup> list) && !list.Contains(enemySetup))
				{
					list.Add(enemySetup);
					return true;
				}
			}
			return false;
		}

		public static bool TryGetList(this EnemyDirector enemyDirector, Difficulty difficultyType, [NotNullWhen(true)] out List<EnemySetup>? list)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected I4, but got Unknown
			list = (int)difficultyType switch
			{
				0 => enemyDirector.enemiesDifficulty1, 
				1 => enemyDirector.enemiesDifficulty2, 
				2 => enemyDirector.enemiesDifficulty3, 
				_ => null, 
			};
			return list != null;
		}

		public static List<EnemySetup> GetEnemies(this EnemyDirector enemyDirector)
		{
			List<EnemySetup> enemiesDifficulty = enemyDirector.enemiesDifficulty1;
			List<EnemySetup> enemiesDifficulty2 = enemyDirector.enemiesDifficulty2;
			List<EnemySetup> enemiesDifficulty3 = enemyDirector.enemiesDifficulty3;
			List<EnemySetup> list = new List<EnemySetup>(enemiesDifficulty.Count + enemiesDifficulty2.Count + enemiesDifficulty3.Count);
			list.AddRange(enemiesDifficulty);
			list.AddRange(enemiesDifficulty2);
			list.AddRange(enemiesDifficulty3);
			return list;
		}

		public static bool TryGetEnemyByName(this EnemyDirector enemyDirector, string name, [NotNullWhen(true)] out EnemySetup? enemySetup)
		{
			enemySetup = enemyDirector.GetEnemyByName(name);
			return (Object)(object)enemySetup != (Object)null;
		}

		public static EnemySetup? GetEnemyByName(this EnemyDirector enemyDirector, string name)
		{
			string name2 = name;
			return ((IEnumerable<EnemySetup>)enemyDirector.GetEnemies()).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup x) => x.NameEquals(name2)));
		}

		public static bool TryGetEnemyThatContainsName(this EnemyDirector enemyDirector, string name, out EnemySetup enemySetup)
		{
			enemySetup = enemyDirector.GetEnemyThatContainsName(name);
			return (Object)(object)enemySetup != (Object)null;
		}

		public static EnemySetup GetEnemyThatContainsName(this EnemyDirector enemyDirector, string name)
		{
			string name2 = name;
			return ((IEnumerable<EnemySetup>)enemyDirector.GetEnemies()).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup x) => x.NameContains(name2)));
		}
	}
	internal static class EnemySetupExtensions
	{
		public static List<GameObject> GetDistinctSpawnObjects(this EnemySetup enemySetup)
		{
			if ((Object)(object)enemySetup == (Object)null || enemySetup.spawnObjects == null)
			{
				return new List<GameObject>();
			}
			return enemySetup.spawnObjects.Where((GameObject x) => (Object)(object)x != (Object)null).Distinct(new UnityObjectNameComparer<GameObject>()).ToList();
		}

		public static List<GameObject> GetSortedSpawnObjects(this EnemySetup enemySetup)
		{
			if ((Object)(object)enemySetup == (Object)null || enemySetup.spawnObjects == null)
			{
				return new List<GameObject>();
			}
			EnemyParent val = default(EnemyParent);
			return (from x in enemySetup.spawnObjects
				where (Object)(object)x != (Object)null
				orderby x.TryGetComponent<EnemyParent>(ref val) descending
				select x).ToList();
		}

		public static GameObject? GetMainSpawnObject(this EnemySetup enemySetup)
		{
			EnemyParent? enemyParent = enemySetup.GetEnemyParent();
			if (enemyParent == null)
			{
				return null;
			}
			return ((Component)enemyParent).gameObject;
		}

		public static EnemyParent? GetEnemyParent(this EnemySetup enemySetup)
		{
			EnemyParent result = default(EnemyParent);
			foreach (GameObject distinctSpawnObject in enemySetup.GetDistinctSpawnObjects())
			{
				if (distinctSpawnObject.TryGetComponent<EnemyParent>(ref result))
				{
					return result;
				}
			}
			return null;
		}

		public static bool TryGetEnemyParent(this EnemySetup enemySetup, [NotNullWhen(true)] out EnemyParent? enemyParent)
		{
			enemyParent = enemySetup.GetEnemyParent();
			return (Object)(object)enemyParent != (Object)null;
		}

		public static bool AnySpawnObjectsNameEquals(this EnemySetup enemySetup, string name)
		{
			string name2 = name;
			if ((Object)(object)enemySetup == (Object)null)
			{
				return false;
			}
			return enemySetup.GetDistinctSpawnObjects().Any((GameObject x) => ((Object)x).name.Equals(na

plugins/REPOZoomyEyes.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Threading;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Photon.Pun;
using TMPro;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using ZoomyEyes.Config;
using ZoomyEyes.Controllers;
using ZoomyEyes.Patches;
using ZoomyEyes.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("REPOZoomyEyes")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("REPOZoomyEyes")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("ca40feb7-1f42-46cf-818f-e3cd22d1b372")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace ZoomyEyes
{
	[BepInPlugin("ZoomyEyes", "ZoomyEyes", "1.1.0")]
	public class ZoomyEyesPlugin : BaseUnityPlugin
	{
		public enum ZoomState
		{
			Default,
			ZoomedIn,
			ZoomedOut
		}

		public class SoundTransition
		{
			public AudioClip Clip;

			public float Pitch;
		}

		public const string PLUGIN_GUID = "ZoomyEyes";

		public const string PLUGIN_NAME = "ZoomyEyes";

		public const string PLUGIN_VERSION = "1.1.0";

		public static ZoomyEyesPlugin Instance;

		private readonly Harmony harmony = new Harmony("ZoomyEyes");

		internal static ManualLogSource Log;

		public const float TRANSITION_SPEED = 5f;

		public const float EASING_DURATION = 0.3f;

		public const float ZOOM_IN_PITCH = 1.2f;

		public const float ZOOM_OUT_PITCH = 0.8f;

		public const bool ENABLE_SCROLL_WHEEL = true;

		public const float SCROLL_NETWORK_THROTTLE = 0.1f;

		public const float SCROLL_SMOOTHING_FACTOR = 0.3f;

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

		public static ConfigEntry<KeyCode> ZoomKey;

		public static ConfigEntry<bool> EnableDebugLogging;

		public static ConfigEntry<bool> InvertPupilZoom;

		public static ConfigEntry<bool> EnableSounds;

		public static ConfigEntry<float> SoundVolume;

		public static ConfigEntry<float> DefaultNormalPupilSize;

		public static AudioClip DefaultZoomSound;

		public static AudioClip DefaultUnZoomSound;

		public static ConfigEntry<float> DefaultPupilSize;

		public static ConfigEntry<float> ZoomedInPupilSize;

		public static ConfigEntry<float> ZoomedOutPupilSize;

		public static ConfigEntry<float> DefaultZoomFOVMultiplier;

		public static ConfigEntry<float> ZoomedInFOVMultiplier;

		public static ConfigEntry<float> ZoomedOutFOVMultiplier;

		internal static List<Camera> playerCameras = new List<Camera>();

		public static Dictionary<(ZoomState from, ZoomState to), SoundTransition> SoundTransitions = new Dictionary<(ZoomState, ZoomState), SoundTransition>();

		public static float NORMAL_PUPIL_SIZE => DefaultNormalPupilSize.Value;

		private void Awake()
		{
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Expected O, but got Unknown
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Expected O, but got Unknown
			//IL_012a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0134: Expected O, but got Unknown
			//IL_0167: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Expected O, but got Unknown
			//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ae: Expected O, but got Unknown
			//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01eb: Expected O, but got Unknown
			//IL_021e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0228: Expected O, but got Unknown
			//IL_025b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0265: Expected O, but got Unknown
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			Log = ((BaseUnityPlugin)this).Logger;
			ZoomKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("General", "ZoomKey", (KeyCode)122, "Key to zoom eyes and FOV");
			InvertPupilZoom = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "InvertPupilZoom", true, "If disabled, pupils will grow larger when zoomed out and smaller when zoomed in");
			DefaultNormalPupilSize = ((BaseUnityPlugin)this).Config.Bind<float>("General", "NormalPupilSize", 1f, new ConfigDescription("Default pupil size when not zooming (1.0 is game default)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.2f, 3f), Array.Empty<object>()));
			EnableSounds = ((BaseUnityPlugin)this).Config.Bind<bool>("Sound", "EnableSounds", true, "Enable zoom sound effects");
			SoundVolume = ((BaseUnityPlugin)this).Config.Bind<float>("Sound", "SoundVolume", 0.5f, new ConfigDescription("Volume for zoom sound effects (0.0-1.0)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>()));
			DefaultPupilSize = ((BaseUnityPlugin)this).Config.Bind<float>("Zoom Levels", "DefaultPupilSize", 2f, new ConfigDescription("Default pupil size when the zoom key is pressed", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1.6f, 2.4f), Array.Empty<object>()));
			ZoomedInPupilSize = ((BaseUnityPlugin)this).Config.Bind<float>("Zoom Levels", "ZoomedInPupilSize", 0.2f, new ConfigDescription("Pupil size when zoomed in (scroll up)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 0.5f), Array.Empty<object>()));
			ZoomedOutPupilSize = ((BaseUnityPlugin)this).Config.Bind<float>("Zoom Levels", "ZoomedOutPupilSize", 3f, new ConfigDescription("Pupil size when zoomed out (scroll down)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(2.5f, 4f), Array.Empty<object>()));
			DefaultZoomFOVMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Zoom Levels", "DefaultZoomFOVMultiplier", 0.8f, new ConfigDescription("Default FOV multiplier when the zoom key is pressed", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.6f, 1f), Array.Empty<object>()));
			ZoomedInFOVMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Zoom Levels", "ZoomedInFOVMultiplier", 0.5f, new ConfigDescription("FOV multiplier when zoomed in", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.3f, 0.7f), Array.Empty<object>()));
			ZoomedOutFOVMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Zoom Levels", "ZoomedOutFOVMultiplier", 1.4f, new ConfigDescription("FOV multiplier when zoomed out", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1.2f, 1.8f), Array.Empty<object>()));
			EnableDebugLogging = ((BaseUnityPlugin)this).Config.Bind<bool>("Debug", "EnableDebugLogging", false, "Enable additional debug logging");
			Log.LogInfo((object)"Plugin ZoomyEyes is loading...");
			InitializeSoundTransitions();
			LoadAudioFiles();
			harmony.PatchAll();
			Log.LogInfo((object)"Plugin ZoomyEyes is loaded!");
			if (InvertPupilZoom.Value)
			{
				Log.LogInfo((object)"Pupil zoom inversion is enabled - pupils will dilate when zoomed in and contract when zoomed out");
			}
			Log.LogInfo((object)$"Default normal pupil size set to: {DefaultNormalPupilSize.Value}");
			DefaultNormalPupilSize.SettingChanged += delegate
			{
				ApplyNormalPupilSizeToAll();
				Log.LogInfo((object)$"Normal pupil size changed to: {DefaultNormalPupilSize.Value}");
			};
		}

		private void InitializeSoundTransitions()
		{
			SoundTransitions[(ZoomState.Default, ZoomState.ZoomedIn)] = new SoundTransition
			{
				Clip = DefaultZoomSound,
				Pitch = 1.4f
			};
			SoundTransitions[(ZoomState.ZoomedIn, ZoomState.Default)] = new SoundTransition
			{
				Clip = DefaultUnZoomSound,
				Pitch = 0.8f
			};
			SoundTransitions[(ZoomState.Default, ZoomState.ZoomedOut)] = new SoundTransition
			{
				Clip = DefaultUnZoomSound,
				Pitch = 0.6f
			};
			SoundTransitions[(ZoomState.ZoomedOut, ZoomState.Default)] = new SoundTransition
			{
				Clip = DefaultZoomSound,
				Pitch = 1.2f
			};
		}

		public static void LogMenuPageColorText(MenuPageColor menuPage)
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: 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_0229: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				TextMeshProUGUI[] componentsInChildren = ((Component)menuPage).GetComponentsInChildren<TextMeshProUGUI>(true);
				Log.LogInfo((object)$"Found {componentsInChildren.Length} TextMeshProUGUI components in MenuPageColor menu");
				TextMeshProUGUI[] array = componentsInChildren;
				foreach (TextMeshProUGUI val in array)
				{
					if ((Object)(object)val != (Object)null)
					{
						string gameObjectPath = GetGameObjectPath(((TMP_Text)val).transform);
						Color color = ((Graphic)val).color;
						Log.LogInfo((object)("Text '" + ((Object)((Component)val).gameObject).name + "' at path '" + gameObjectPath + "':"));
						Log.LogInfo((object)("  Content: \"" + ((TMP_Text)val).text + "\""));
						Log.LogInfo((object)$"  Color: R={color.r:F2}, G={color.g:F2}, B={color.b:F2}, A={color.a:F2}");
						Log.LogInfo((object)$"  Font Size: {((TMP_Text)val).fontSize}");
						Log.LogInfo((object)$"  Font Style: {((TMP_Text)val).fontStyle}");
						Log.LogInfo((object)$"  Alignment: {((TMP_Text)val).alignment}");
						ManualLogSource log = Log;
						TMP_FontAsset font = ((TMP_Text)val).font;
						log.LogInfo((object)("  Font: " + (((font != null) ? ((Object)font).name : null) ?? "null")));
						Log.LogInfo((object)$"  Enable Auto Sizing: {((TMP_Text)val).enableAutoSizing}");
						if (((TMP_Text)val).text.Contains("Color"))
						{
							Log.LogInfo((object)"  ** This appears to be the 'Select Color' text **");
							ManualLogSource log2 = Log;
							Material material = ((Graphic)val).material;
							log2.LogInfo((object)("  Material: " + (((material != null) ? ((Object)material).name : null) ?? "null")));
							Log.LogInfo((object)$"  Margin: {((TMP_Text)val).margin}");
							Log.LogInfo((object)$"  Character Spacing: {((TMP_Text)val).characterSpacing}");
							Log.LogInfo((object)$"  Word Spacing: {((TMP_Text)val).wordSpacing}");
							Log.LogInfo((object)$"  Line Spacing: {((TMP_Text)val).lineSpacing}");
							Log.LogInfo((object)$"  Paragraph Spacing: {((TMP_Text)val).paragraphSpacing}");
						}
					}
				}
			}
			catch (Exception ex)
			{
				Log.LogError((object)("Error inspecting menu text: " + ex.Message));
			}
		}

		private static string GetGameObjectPath(Transform transform)
		{
			string text = ((Object)transform).name;
			Transform parent = transform.parent;
			while ((Object)(object)parent != (Object)null)
			{
				text = ((Object)parent).name + "/" + text;
				parent = parent.parent;
			}
			return text;
		}

		private void LoadAudioFiles()
		{
			try
			{
				string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
				string text = Path.Combine(directoryName, "DefaultZoomSound.wav");
				if (File.Exists(text))
				{
					DefaultZoomSound = LoadWavFileAsAudioClip(text, "DefaultZoomSound");
					Log.LogInfo((object)"Loaded DefaultZoomSound.wav successfully");
				}
				else
				{
					Log.LogWarning((object)("Could not find DefaultZoomSound.wav at path: " + text));
					Log.LogWarning((object)"Place the sound file in your BepInEx/plugins/ZoomyEyes folder");
				}
				string text2 = Path.Combine(directoryName, "DefaultUnZoomSound.wav");
				if (File.Exists(text2))
				{
					DefaultUnZoomSound = LoadWavFileAsAudioClip(text2, "DefaultUnZoomSound");
					Log.LogInfo((object)"Loaded DefaultUnZoomSound.wav successfully");
				}
				else
				{
					Log.LogWarning((object)("Could not find DefaultUnZoomSound.wav at path: " + text2));
					Log.LogWarning((object)"Place the sound file in your BepInEx/plugins/ZoomyEyes folder");
					if ((Object)(object)DefaultZoomSound != (Object)null)
					{
						Log.LogInfo((object)"Using DefaultZoomSound.wav as a fallback for unzoom sound");
						DefaultUnZoomSound = DefaultZoomSound;
					}
				}
				InitializeSoundTransitions();
			}
			catch (Exception ex)
			{
				Log.LogError((object)("Error loading audio files: " + ex.Message));
			}
		}

		private AudioClip LoadWavFileAsAudioClip(string filePath, string clipName)
		{
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Invalid comparison between Unknown and I4
			try
			{
				string text = "file://" + filePath;
				UnityWebRequest audioClip = UnityWebRequestMultimedia.GetAudioClip(text, (AudioType)20);
				UnityWebRequestAsyncOperation val = audioClip.SendWebRequest();
				while (!((AsyncOperation)val).isDone)
				{
					Thread.Sleep(10);
				}
				if ((int)audioClip.result != 1)
				{
					Log.LogError((object)("Error loading audio file: " + audioClip.error));
					return null;
				}
				AudioClip content = DownloadHandlerAudioClip.GetContent(audioClip);
				((Object)content).name = clipName;
				return content;
			}
			catch (Exception ex)
			{
				Log.LogError((object)("Error loading WAV file " + filePath + ": " + ex.Message));
				return null;
			}
		}

		public static bool IsInMainMenu()
		{
			if ((Object)(object)RunManager.instance == (Object)null)
			{
				return true;
			}
			return (Object)(object)RunManager.instance.levelCurrent == (Object)(object)RunManager.instance.levelMainMenu;
		}

		public static void DebugLog(string message)
		{
			if (EnableDebugLogging.Value)
			{
				Log.LogInfo((object)("[DEBUG] " + message));
			}
		}

		public static SoundTransition GetSoundTransition(ZoomState fromState, ZoomState toState)
		{
			if (SoundTransitions.TryGetValue((fromState, toState), out var value))
			{
				return value;
			}
			bool flag = IsZoomingIn(fromState, toState);
			return new SoundTransition
			{
				Clip = (flag ? DefaultZoomSound : DefaultUnZoomSound),
				Pitch = (flag ? 1.2f : 0.8f)
			};
		}

		public static bool IsZoomingIn(ZoomState fromState, ZoomState toState)
		{
			if (fromState == ZoomState.ZoomedOut && toState == ZoomState.Default)
			{
				return true;
			}
			if (fromState == ZoomState.Default && toState == ZoomState.ZoomedIn)
			{
				return true;
			}
			return false;
		}

		public static void PlaySoundAtPosition(AudioClip clip, Vector3 position, float pitch = 1f, float volume = 1f)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			if (!EnableSounds.Value || (Object)(object)clip == (Object)null)
			{
				return;
			}
			try
			{
				GameObject val = new GameObject("TempAudio");
				val.transform.position = position;
				AudioSource val2 = val.AddComponent<AudioSource>();
				val2.clip = clip;
				val2.volume = volume * SoundVolume.Value;
				val2.pitch = pitch;
				val2.spatialBlend = 1f;
				val2.minDistance = 1f;
				val2.maxDistance = 15f;
				val2.rolloffMode = (AudioRolloffMode)1;
				val2.Play();
				Object.Destroy((Object)(object)val, clip.length / pitch + 0.1f);
				DebugLog($"Playing sound {((Object)clip).name} at position {position} with pitch {pitch}");
			}
			catch (Exception ex)
			{
				Log.LogError((object)("Error playing sound: " + ex.Message));
			}
		}

		public static void ApplyNormalPupilSizeToAll()
		{
			try
			{
				if (IsInMainMenu())
				{
					return;
				}
				List<PlayerAvatar> list = SemiFunc.PlayerGetAll();
				foreach (PlayerAvatar item in list)
				{
					if ((Object)(object)item.photonView != (Object)null)
					{
						int viewID = item.photonView.ViewID;
						if (item.photonView.IsMine)
						{
							PupilStateManager.SetDefaultSize(viewID, DefaultNormalPupilSize.Value);
						}
					}
				}
				PupilStateManager.UpdateMenuAvatarPupils();
				DebugLog($"Applied normal pupil size to all players: {DefaultNormalPupilSize.Value}");
			}
			catch (Exception ex)
			{
				Log.LogError((object)("Error applying normal pupil size: " + ex.Message));
			}
		}
	}
}
namespace ZoomyEyes.UI
{
	public class SliderValueHandler : MonoBehaviour
	{
		[CompilerGenerated]
		private sealed class <DelayedDiagnostics>d__4 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public SliderValueHandler <>4__this;

			private float <configValue>5__1;

			private float <normalizedValue>5__2;

			private Transform <barText>5__3;

			private TextMeshProUGUI <textComponent>5__4;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <DelayedDiagnostics>d__4(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<barText>5__3 = null;
				<textComponent>5__4 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0034: Unknown result type (might be due to invalid IL or missing references)
				//IL_003e: Expected O, but got Unknown
				//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f0: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitForSeconds(1f);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					if ((Object)(object)<>4__this.slider != (Object)null)
					{
						<configValue>5__1 = ZoomyEyesPlugin.DefaultNormalPupilSize.Value;
						<normalizedValue>5__2 = <>4__this.NormalizedPupilSizeToSliderValue(<configValue>5__1);
						ZoomyEyesPlugin.DebugLog($"DEBUG: After delay - Original slider value would be {PupilSliderConfig.PupilSizeToSliderValue(<configValue>5__1):F1}");
						ZoomyEyesPlugin.DebugLog($"DEBUG: After delay - Trying normalized value (0-1): {<normalizedValue>5__2:F3}");
						<>4__this.slider.SetBar(<normalizedValue>5__2);
						<>2__current = (object)new WaitForSeconds(0.1f);
						<>1__state = 2;
						return true;
					}
					break;
				case 2:
					<>1__state = -1;
					<barText>5__3 = ((Component)<>4__this.slider).transform.Find("Bar Text");
					if ((Object)(object)<barText>5__3 != (Object)null)
					{
						<textComponent>5__4 = ((Component)<barText>5__3).GetComponent<TextMeshProUGUI>();
						if ((Object)(object)<textComponent>5__4 != (Object)null)
						{
							ZoomyEyesPlugin.DebugLog("DEBUG: After setting normalized value - Text shows: " + ((TMP_Text)<textComponent>5__4).text);
						}
						<textComponent>5__4 = null;
					}
					<barText>5__3 = null;
					break;
				}
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		private MenuSlider slider;

		private bool initialized = false;

		private float lastSetValue = -1f;

		public void Initialize(MenuSlider slider)
		{
			this.slider = slider;
			initialized = true;
			RefreshSliderPosition();
			((MonoBehaviour)this).StartCoroutine(DelayedDiagnostics());
		}

		[IteratorStateMachine(typeof(<DelayedDiagnostics>d__4))]
		private IEnumerator DelayedDiagnostics()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <DelayedDiagnostics>d__4(0)
			{
				<>4__this = this
			};
		}

		private float NormalizedPupilSizeToSliderValue(float pupilSize)
		{
			float num = PupilSliderConfig.MaxPupilSize - PupilSliderConfig.MinPupilSize;
			return (pupilSize - PupilSliderConfig.MinPupilSize) / num;
		}

		public void RefreshSliderPosition()
		{
			if (initialized && !((Object)(object)slider == (Object)null))
			{
				float value = ZoomyEyesPlugin.DefaultNormalPupilSize.Value;
				float num = NormalizedPupilSizeToSliderValue(value);
				if (Mathf.Abs(num - lastSetValue) > 0.01f)
				{
					slider.SetBar(num);
					lastSetValue = num;
					ZoomyEyesPlugin.DebugLog($"Updated slider position to normalized value: {num:F3} (pupil size: {value:F2})");
				}
			}
		}

		private void OnEnable()
		{
			RefreshSliderPosition();
		}
	}
	public class SliderReinitializer : MonoBehaviour
	{
		public string elementName = "";

		public MenuSlider menuSlider;

		public float startValue;

		public void Start()
		{
			try
			{
				if (!((Object)(object)menuSlider != (Object)null))
				{
					return;
				}
				menuSlider.elementName = elementName;
				Transform val = ((Component)this).transform.Find("Element Name");
				if ((Object)(object)val != (Object)null)
				{
					TextMeshProUGUI component = ((Component)val).GetComponent<TextMeshProUGUI>();
					if ((Object)(object)component != (Object)null)
					{
						((TMP_Text)component).SetText(elementName, true);
					}
				}
				((Object)((Component)this).gameObject).name = "Slider - " + elementName;
				if (elementName == "Pupil Size")
				{
					float value = ZoomyEyesPlugin.DefaultNormalPupilSize.Value;
					float num = PupilSliderConfig.MaxPupilSize - PupilSliderConfig.MinPupilSize;
					startValue = (value - PupilSliderConfig.MinPupilSize) / num;
					ZoomyEyesPlugin.DebugLog($"Initializing slider with config value {value:F2} -> normalized position {startValue:F3}");
					float num2 = PupilSliderConfig.SliderValueToPupilSize(startValue);
					ZoomyEyesPlugin.DefaultNormalPupilSize.Value = num2;
					ZoomyEyesPlugin.DebugLog($"Updated pupil size config during initialization: {num2:F2}");
				}
				menuSlider.SetBar(startValue);
				if (!(elementName == "Pupil Size"))
				{
					return;
				}
				Transform val2 = ((Component)this).transform.Find("Bar Text");
				if ((Object)(object)val2 != (Object)null)
				{
					TextMeshProUGUI component2 = ((Component)val2).GetComponent<TextMeshProUGUI>();
					if ((Object)(object)component2 != (Object)null)
					{
						PupilSizeTextUpdater pupilSizeTextUpdater = ((Component)this).gameObject.AddComponent<PupilSizeTextUpdater>();
						pupilSizeTextUpdater.Initialize(component2);
						ZoomyEyesPlugin.Log.LogInfo((object)"Added text updater in SliderReinitializer");
					}
				}
				PupilStateManager.UpdateMenuAvatarPupils();
			}
			catch (Exception ex)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error in SliderReinitializer.Start: " + ex.Message));
			}
		}
	}
	public class PupilSizeTextUpdater : MonoBehaviour
	{
		[CompilerGenerated]
		private sealed class <ApplyInitialValueWithDelay>d__9 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public PupilSizeTextUpdater <>4__this;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <ApplyInitialValueWithDelay>d__9(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				//IL_0030: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitForSeconds(0.5f);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					PupilStateManager.UpdateMenuAvatarPupils();
					ZoomyEyesPlugin.DebugLog("Applied initial pupil size after delay");
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <ApplyPendingUpdate>d__12 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public PupilSizeTextUpdater <>4__this;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <ApplyPendingUpdate>d__12(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0036: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitForSeconds(<>4__this.dragEndDelay);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					if (<>4__this.pendingPupilSize >= 0f)
					{
						<>4__this.RequestPupilSizeUpdate(<>4__this.pendingPupilSize);
						<>4__this.pendingPupilSize = -1f;
					}
					<>4__this.pendingUpdateCoroutine = null;
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		private TextMeshProUGUI mainTextComponent;

		private TextMeshProUGUI maskedTextComponent;

		private string lastSetText = "";

		private float lastUpdateTime = 0f;

		private float updateDelay = 0.1f;

		private float dragEndDelay = 0.3f;

		private float pendingPupilSize = -1f;

		private Coroutine pendingUpdateCoroutine = null;

		public void Initialize(TextMeshProUGUI mainText)
		{
			mainTextComponent = mainText;
			Transform val = ((Component)this).transform.Find("MaskedText");
			if ((Object)(object)val != (Object)null && ((Component)val).gameObject.activeSelf)
			{
				Transform val2 = val.Find("Bar Text (1)");
				if ((Object)(object)val2 != (Object)null)
				{
					maskedTextComponent = ((Component)val2).GetComponent<TextMeshProUGUI>();
				}
			}
			((MonoBehaviour)this).StartCoroutine(ApplyInitialValueWithDelay());
		}

		[IteratorStateMachine(typeof(<ApplyInitialValueWithDelay>d__9))]
		private IEnumerator ApplyInitialValueWithDelay()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <ApplyInitialValueWithDelay>d__9(0)
			{
				<>4__this = this
			};
		}

		private void Update()
		{
			try
			{
				UpdateTextIfPercentage(mainTextComponent);
				UpdateTextIfPercentage(maskedTextComponent);
			}
			catch (Exception ex)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error in PupilSizeTextUpdater: " + ex.Message));
				Object.Destroy((Object)(object)this);
			}
		}

		private void UpdateTextIfPercentage(TextMeshProUGUI textComponent)
		{
			if ((Object)(object)textComponent == (Object)null)
			{
				return;
			}
			string text = ((TMP_Text)textComponent).text;
			if (!text.EndsWith("%") || !float.TryParse(text.TrimEnd(new char[1] { '%' }), out var result))
			{
				return;
			}
			float sliderValue = result / 100f;
			float num = PupilSliderConfig.SliderValueToPupilSize(sliderValue);
			string text3 = (((TMP_Text)textComponent).text = PupilSliderConfig.FormatPupilSizeText(num));
			if (text3 != lastSetText)
			{
				lastSetText = text3;
				ZoomyEyesPlugin.DefaultNormalPupilSize.Value = num;
				pendingPupilSize = num;
				float time = Time.time;
				if (time - lastUpdateTime >= updateDelay)
				{
					lastUpdateTime = time;
					RequestPupilSizeUpdate(num);
				}
				if (pendingUpdateCoroutine != null)
				{
					((MonoBehaviour)this).StopCoroutine(pendingUpdateCoroutine);
				}
				pendingUpdateCoroutine = ((MonoBehaviour)this).StartCoroutine(ApplyPendingUpdate());
				ZoomyEyesPlugin.DebugLog("Updated slider text in Update: " + text3);
			}
		}

		[IteratorStateMachine(typeof(<ApplyPendingUpdate>d__12))]
		private IEnumerator ApplyPendingUpdate()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <ApplyPendingUpdate>d__12(0)
			{
				<>4__this = this
			};
		}

		private void RequestPupilSizeUpdate(float pupilSize)
		{
			ZoomyEyesPlugin.DefaultNormalPupilSize.Value = pupilSize;
			PupilStateManager.ApplyNormalPupilSizeToAll();
			PupilStateManager.UpdateMenuAvatarPupils();
		}
	}
}
namespace ZoomyEyes.Patches
{
	[HarmonyPatch(typeof(CameraZoom))]
	internal class CameraZoomPatch
	{
		[HarmonyPatch("Awake")]
		[HarmonyPostfix]
		private static void CapturePlayerCameras(CameraZoom __instance)
		{
			try
			{
				if (__instance.cams == null)
				{
					return;
				}
				ZoomyEyesPlugin.Log.LogInfo((object)$"Found {__instance.cams.Count} cameras in CameraZoom");
				foreach (Camera cam in __instance.cams)
				{
					if ((Object)(object)cam != (Object)null && !ZoomyEyesPlugin.playerCameras.Contains(cam))
					{
						ZoomyEyesPlugin.playerCameras.Add(cam);
						ZoomyEyesPlugin.Log.LogInfo((object)("Added camera: " + ((Object)cam).name + " to tracking list"));
					}
				}
			}
			catch (Exception ex)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error capturing cameras: " + ex.Message));
			}
		}
	}
	[HarmonyPatch(typeof(MenuPageColor))]
	internal class MenuPageColorPatch
	{
		public static MenuSlider PupilSizeSlider;

		private static bool sliderAdded;

		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		private static void AddPupilSizeSlider(MenuPageColor __instance)
		{
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				GameObject val = null;
				foreach (MenuPages menuPage2 in MenuManager.instance.menuPages)
				{
					GameObject menuPage = menuPage2.menuPage;
					if (((Object)menuPage).name == "Menu Page Settings Audio")
					{
						Transform val2 = menuPage.transform.Find("Menu Scroll Box");
						Transform val3 = ((val2 != null) ? val2.Find("Mask") : null);
						Transform val4 = ((val3 != null) ? val3.Find("Scroller") : null);
						Transform val5 = ((val4 != null) ? val4.Find("Slider - Master volume") : null);
						if ((Object)(object)val5 != (Object)null)
						{
							val = ((Component)val5).gameObject;
							break;
						}
					}
				}
				if ((Object)(object)val != (Object)null)
				{
					PupilSizeSlider = CreatePupilSizeSlider(val, ((Component)__instance).transform, PupilSliderConfig.SliderPosition, PupilSliderConfig.SliderName);
					((Object)((Component)PupilSizeSlider).gameObject).name = "Slider - Pupil Size";
					AddCustomSliderListener(PupilSizeSlider);
					sliderAdded = true;
					ZoomyEyesPlugin.Log.LogInfo((object)"Added pupil size slider to color menu");
				}
			}
			catch (Exception ex)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error adding pupil size slider to color menu: " + ex.Message));
			}
		}

		private static void AddCustomSliderListener(MenuSlider slider)
		{
			try
			{
				SliderValueHandler sliderValueHandler = ((Component)slider).gameObject.AddComponent<SliderValueHandler>();
				sliderValueHandler.Initialize(slider);
				ZoomyEyesPlugin.DebugLog("Added custom slider value handler");
			}
			catch (Exception ex)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error adding slider value handler: " + ex.Message));
			}
		}

		private static MenuSlider CreatePupilSizeSlider(GameObject sliderPrefab, Transform parentTransform, Vector3 position, string elementName)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_0155: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = Object.Instantiate<GameObject>(sliderPrefab, parentTransform);
			val.transform.position = position;
			Transform val2 = val.transform.Find("MaskedText");
			if ((Object)(object)val2 != (Object)null)
			{
				((Component)val2).gameObject.SetActive(true);
				Transform val3 = val2.Find("Bar Text (1)");
				if ((Object)(object)val3 != (Object)null)
				{
					TextMeshProUGUI component = ((Component)val3).GetComponent<TextMeshProUGUI>();
					if ((Object)(object)component != (Object)null)
					{
						((Graphic)component).color = new Color(0f, 0f, 0f);
					}
				}
			}
			Transform obj = val.transform.Find("SliderBG");
			Transform val4 = ((obj != null) ? obj.Find("RawImage (2)") : null);
			if ((Object)(object)val4 != (Object)null)
			{
				((Component)val4).gameObject.SetActive(false);
			}
			Transform obj2 = val.transform.Find("SliderBG");
			Transform val5 = ((obj2 != null) ? obj2.Find("RawImage (3)") : null);
			if ((Object)(object)val5 != (Object)null)
			{
				((Graphic)((Component)val5).GetComponent<RawImage>()).color = PupilSliderConfig.SliderBackgroundColor;
			}
			Transform val6 = val.transform.Find("Bar");
			if ((Object)(object)val6 != (Object)null)
			{
				Transform val7 = val6.Find("RawImage");
				if ((Object)(object)val7 != (Object)null)
				{
					((Graphic)((Component)val7).GetComponent<RawImage>()).color = PupilSliderConfig.SliderBarColor;
				}
			}
			MenuSlider component2 = val.GetComponent<MenuSlider>();
			if ((Object)(object)component2 != (Object)null)
			{
				component2.pointerSegmentJump = 1;
				component2.buttonSegmentJump = 1;
			}
			MenuSetting component3 = val.GetComponent<MenuSetting>();
			if ((Object)(object)component3 != (Object)null)
			{
				Object.Destroy((Object)(object)component3);
			}
			MenuSettingElement component4 = val.GetComponent<MenuSettingElement>();
			if ((Object)(object)component4 != (Object)null)
			{
				Object.Destroy((Object)(object)component4);
			}
			SliderReinitializer sliderReinitializer = val.AddComponent<SliderReinitializer>();
			sliderReinitializer.menuSlider = component2;
			sliderReinitializer.elementName = elementName;
			float value = ZoomyEyesPlugin.DefaultNormalPupilSize.Value;
			ZoomyEyesPlugin.DebugLog(string.Format(arg1: sliderReinitializer.startValue = PupilSliderConfig.PupilSizeToSliderValue(value), format: "Created slider with initial value {0:F2} -> slider position {1:F1}", arg0: value));
			return component2;
		}
	}
	[HarmonyPatch(typeof(MenuSlider), "SetBar")]
	internal class MenuSliderSetBarPatch
	{
		[HarmonyPostfix]
		private static void UpdatePupilSizeText(MenuSlider __instance, float value)
		{
			try
			{
				if (!(__instance.elementName == "Pupil Size"))
				{
					return;
				}
				float num = PupilSliderConfig.SliderValueToPupilSize(value);
				string text = PupilSliderConfig.FormatPupilSizeText(num);
				Transform val = ((Component)__instance).transform.Find("Bar Text");
				if ((Object)(object)val != (Object)null)
				{
					TextMeshProUGUI component = ((Component)val).GetComponent<TextMeshProUGUI>();
					if ((Object)(object)component != (Object)null)
					{
						((TMP_Text)component).text = text;
					}
				}
				Transform val2 = ((Component)__instance).transform.Find("MaskedText");
				if ((Object)(object)val2 != (Object)null && ((Component)val2).gameObject.activeSelf)
				{
					Transform val3 = val2.Find("Bar Text (1)");
					if ((Object)(object)val3 != (Object)null)
					{
						TextMeshProUGUI component2 = ((Component)val3).GetComponent<TextMeshProUGUI>();
						if ((Object)(object)component2 != (Object)null)
						{
							((TMP_Text)component2).text = text;
						}
					}
				}
				if (value > 0.01f && Mathf.Abs(num - ZoomyEyesPlugin.DefaultNormalPupilSize.Value) > 0.01f)
				{
					ZoomyEyesPlugin.DefaultNormalPupilSize.Value = num;
					PlayerAvatar val4 = FindLocalPlayer();
					if ((Object)(object)val4 != (Object)null && (Object)(object)val4.photonView != (Object)null)
					{
						int viewID = val4.photonView.ViewID;
						PupilStateManager.SetDefaultSize(viewID, num);
					}
					ZoomyEyesPlugin.DebugLog($"Pupil size updated from slider SetBar: {value:F1}% -> {num:F2}");
				}
				ZoomyEyesPlugin.DebugLog("Updated slider text to: " + text);
			}
			catch (Exception ex)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error updating slider text: " + ex.Message));
			}
		}

		private static PlayerAvatar FindLocalPlayer()
		{
			PlayerAvatar[] array = Object.FindObjectsOfType<PlayerAvatar>();
			PlayerAvatar[] array2 = array;
			foreach (PlayerAvatar val in array2)
			{
				if ((Object)(object)val != (Object)null && (Object)(object)val.photonView != (Object)null && val.photonView.IsMine)
				{
					return val;
				}
			}
			return null;
		}
	}
	[HarmonyPatch(typeof(MenuPageColor), "ConfirmButton")]
	internal class MenuPageConfirmButtonPatch
	{
		[HarmonyPostfix]
		private static void SavePupilSizeToConfig(MenuPageColor __instance)
		{
			try
			{
				float value = ZoomyEyesPlugin.DefaultNormalPupilSize.Value;
				ZoomyEyesPlugin.Log.LogInfo((object)$"Current pupil size before saving: {value}");
				if ((Object)(object)MenuPageColorPatch.PupilSizeSlider != (Object)null)
				{
					Transform val = ((Component)MenuPageColorPatch.PupilSizeSlider).transform.Find("Bar Text");
					if ((Object)(object)val != (Object)null)
					{
						TextMeshProUGUI component = ((Component)val).GetComponent<TextMeshProUGUI>();
						if ((Object)(object)component != (Object)null)
						{
							ZoomyEyesPlugin.Log.LogInfo((object)("Displayed slider text: " + ((TMP_Text)component).text));
						}
					}
				}
				((BaseUnityPlugin)ZoomyEyesPlugin.Instance).Config.Save();
				ZoomyEyesPlugin.Log.LogInfo((object)$"Saved pupil size configuration: {ZoomyEyesPlugin.DefaultNormalPupilSize.Value}");
				PlayerAvatar val2 = FindLocalPlayer();
				if ((Object)(object)val2 != (Object)null)
				{
					int viewID = val2.photonView.ViewID;
					PupilStateManager.SetDefaultSize(viewID, ZoomyEyesPlugin.DefaultNormalPupilSize.Value);
				}
				if ((Object)(object)val2 != (Object)null && (Object)(object)val2.photonView != (Object)null && PhotonNetwork.IsConnected && PhotonNetwork.InRoom)
				{
					val2.photonView.RPC("SyncDefaultPupilSize", (RpcTarget)1, new object[1] { ZoomyEyesPlugin.DefaultNormalPupilSize.Value });
					PlayerAvatarPatch.lastSentDefaultPupilSize = ZoomyEyesPlugin.DefaultNormalPupilSize.Value;
					ZoomyEyesPlugin.Log.LogInfo((object)"Sent pupil size update after save");
				}
			}
			catch (Exception ex)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error saving pupil size config: " + ex.Message));
			}
		}

		private static PlayerAvatar FindLocalPlayer()
		{
			PlayerAvatar[] array = Object.FindObjectsOfType<PlayerAvatar>();
			PlayerAvatar[] array2 = array;
			foreach (PlayerAvatar val in array2)
			{
				if ((Object)(object)val != (Object)null && (Object)(object)val.photonView != (Object)null && val.photonView.IsMine)
				{
					return val;
				}
			}
			return null;
		}
	}
	[HarmonyPatch(typeof(MenuManager))]
	[HarmonyPatch("Start")]
	internal class MenuStartPatch
	{
		[HarmonyPostfix]
		private static void Postfix()
		{
			try
			{
				ZoomyEyesPlugin.DebugLog("Menu manager started, updating menu avatar pupils");
				EyeZoomController.UpdateMenuAvatarPupils();
			}
			catch (Exception ex)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error updating menu pupils on menu manager start: " + ex.Message));
			}
		}
	}
	[HarmonyPatch(typeof(PlayerAvatar))]
	internal class PlayerAvatarPatch
	{
		[HarmonyPatch(typeof(TruckScreenText))]
		[HarmonyPatch("ArrowPointAtGoalLogic")]
		internal class DefaultPupilSizeMaintainer
		{
			private static PlayerAvatar cachedLocalPlayer = null;

			private static float lastNetworkUpdateTime = 0f;

			private static float networkUpdateInterval = 0.5f;

			[HarmonyPostfix]
			private static void MaintainDefaultPupilSizes()
			{
				if (ZoomyEyesPlugin.IsInMainMenu())
				{
					return;
				}
				if ((Object)(object)cachedLocalPlayer == (Object)null || (Object)(object)cachedLocalPlayer.photonView == (Object)null || !cachedLocalPlayer.photonView.IsMine)
				{
					List<PlayerAvatar> list = SemiFunc.PlayerGetAll();
					foreach (PlayerAvatar item in list)
					{
						if ((Object)(object)item.photonView != (Object)null && item.photonView.IsMine)
						{
							cachedLocalPlayer = item;
							break;
						}
					}
					if ((Object)(object)cachedLocalPlayer == (Object)null)
					{
						return;
					}
				}
				int viewID = cachedLocalPlayer.photonView.ViewID;
				float value = ZoomyEyesPlugin.DefaultNormalPupilSize.Value;
				PupilStateManager.SetDefaultSize(viewID, value);
				if (Time.time - lastNetworkUpdateTime >= networkUpdateInterval)
				{
					if (Mathf.Abs(value - lastSentDefaultPupilSize) > 0.01f && PhotonNetwork.IsConnected && PhotonNetwork.InRoom)
					{
						cachedLocalPlayer.photonView.RPC("SyncDefaultPupilSize", (RpcTarget)1, new object[1] { value });
						lastSentDefaultPupilSize = value;
						ZoomyEyesPlugin.DebugLog($"Sent updated default pupil size: {value:F2}");
					}
					lastNetworkUpdateTime = Time.time;
				}
			}
		}

		[HarmonyPatch(typeof(PlayerAvatar), "Update")]
		private class PupilSizeMonitorPatch
		{
			private static FieldInfo multiplierTargetField = AccessTools.Field(typeof(PlayerAvatar), "overridePupilSizeMultiplierTarget");

			private static FieldInfo timerField = AccessTools.Field(typeof(PlayerAvatar), "overridePupilSizeTimer");

			[HarmonyPostfix]
			private static void Postfix(PlayerAvatar __instance)
			{
				if ((Object)(object)__instance == (Object)null || (Object)(object)__instance.playerAvatarVisuals == (Object)null || (Object)(object)__instance.playerAvatarVisuals.playerEyes == (Object)null)
				{
					return;
				}
				try
				{
					int playerID = -1;
					if ((Object)(object)__instance.photonView != (Object)null)
					{
						playerID = __instance.photonView.ViewID;
					}
					if (!(multiplierTargetField == null) && !(timerField == null))
					{
						float multiplier = (float)multiplierTargetField.GetValue(__instance);
						float num = (float)timerField.GetValue(__instance);
						PupilStateManager.SetOverrideState(playerID, num > 0f, multiplier);
					}
				}
				catch (Exception ex)
				{
					ZoomyEyesPlugin.Log.LogError((object)("Error in pupil size monitor: " + ex.Message));
				}
			}
		}

		[HarmonyPatch(typeof(TruckScreenText), "ArrowPointAtGoalLogic")]
		internal class CentralPupilController
		{
			[HarmonyPostfix]
			private static void ApplyPupilSizes()
			{
				if (ZoomyEyesPlugin.IsInMainMenu())
				{
					return;
				}
				try
				{
					PupilStateManager.ApplyPupilSizesToAllPlayers();
				}
				catch (Exception ex)
				{
					ZoomyEyesPlugin.Log.LogError((object)("Error in centralized pupil controller: " + ex.Message));
				}
			}
		}

		private static bool wasZKeyPressed = false;

		private static float lastLogTime = 0f;

		private static readonly float LOG_INTERVAL = 0.5f;

		public static float lastSentDefaultPupilSize = 0f;

		[HarmonyPatch("Awake")]
		[HarmonyPostfix]
		private static void AddEyeZoomController(PlayerAvatar __instance)
		{
			try
			{
				if (!((Object)(object)__instance == (Object)null) && !((Object)(object)__instance.playerAvatarVisuals == (Object)null) && !((Object)(object)__instance.playerAvatarVisuals.playerEyes == (Object)null))
				{
					if ((Object)(object)((Component)__instance).GetComponent<EyeZoomController>() == (Object)null)
					{
						((Component)__instance).gameObject.AddComponent<EyeZoomController>();
						ZoomyEyesPlugin.Log.LogInfo((object)("Added EyeZoomController to player: " + ((Object)__instance).name));
					}
					if ((Object)(object)__instance.photonView != (Object)null)
					{
						int viewID = __instance.photonView.ViewID;
						bool isMine = __instance.photonView.IsMine;
						PupilStateManager.SetPlayerEyes(viewID, __instance.playerAvatarVisuals.playerEyes, isMine);
					}
				}
			}
			catch (Exception ex)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error in AddEyeZoomController: " + ex.Message));
			}
		}

		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		private static void HandleEyeZoom(PlayerAvatar __instance)
		{
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if (ZoomyEyesPlugin.IsInMainMenu() || (Object)(object)__instance == (Object)null)
				{
					return;
				}
				PhotonView component = ((Component)__instance).GetComponent<PhotonView>();
				if ((Object)(object)component == (Object)null || !component.IsMine)
				{
					return;
				}
				EyeZoomController component2 = ((Component)__instance).GetComponent<EyeZoomController>();
				if ((Object)(object)component2 == (Object)null)
				{
					return;
				}
				bool key = Input.GetKey(ZoomyEyesPlugin.ZoomKey.Value);
				if (key != wasZKeyPressed)
				{
					float currentFOV = component2.GetCurrentFOV();
					wasZKeyPressed = key;
					component2.SetZooming(key, currentFOV);
					if (PhotonNetwork.IsConnected && PhotonNetwork.InRoom)
					{
						try
						{
							component.RPC("SyncEyeZoom", (RpcTarget)1, new object[7]
							{
								key,
								(int)component2.CurrentZoomState,
								ZoomyEyesPlugin.InvertPupilZoom.Value,
								ZoomyEyesPlugin.DefaultPupilSize.Value,
								ZoomyEyesPlugin.ZoomedInPupilSize.Value,
								ZoomyEyesPlugin.ZoomedOutPupilSize.Value,
								ZoomyEyesPlugin.DefaultNormalPupilSize.Value
							});
						}
						catch (Exception ex)
						{
							ZoomyEyesPlugin.Log.LogError((object)("Error sending RPC: " + ex.Message));
						}
					}
				}
				if (key)
				{
					component2.HandleScrollInput();
				}
			}
			catch (Exception ex2)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error in HandleEyeZoom: " + ex2.Message));
			}
		}
	}
}
namespace ZoomyEyes.Controllers
{
	public class EyeZoomController : MonoBehaviour
	{
		private PlayerEyes playerEyes;

		private PhotonView photonView;

		private float originalPupilSize = 1f;

		private bool isInFOVTransition = false;

		private float fovStartValue;

		private float fovEndValue;

		private float fovTransitionStartTime;

		private float fovTransitionDuration;

		private float currentFOVValue;

		private float trueCurrentFOV = 70f;

		private bool hasZoomedOnce = false;

		private ZoomyEyesPlugin.ZoomState currentZoomState = ZoomyEyesPlugin.ZoomState.Default;

		private ZoomyEyesPlugin.ZoomState targetZoomState = ZoomyEyesPlugin.ZoomState.Default;

		private ZoomyEyesPlugin.ZoomState previousZoomState = ZoomyEyesPlugin.ZoomState.Default;

		private float lastScrollNetworkUpdate = 0f;

		private bool zoomStateChanged = false;

		private float lastFOVChangeTime = 0f;

		private float minimumFOVChangeInterval = 0.1f;

		private float lastFOVLogTime = 0f;

		private const float FOV_LOG_INTERVAL = 5f;

		private float lastFOVCheckTime = 0f;

		private const float FOV_CHECK_INTERVAL = 0.5f;

		public bool isZooming { get; private set; } = false;


		public ZoomyEyesPlugin.ZoomState CurrentZoomState => currentZoomState;

		private void Awake()
		{
			try
			{
				PlayerAvatar component = ((Component)this).GetComponent<PlayerAvatar>();
				if ((Object)(object)component != (Object)null && (Object)(object)component.playerAvatarVisuals != (Object)null)
				{
					playerEyes = component.playerAvatarVisuals.playerEyes;
					photonView = ((Component)this).GetComponent<PhotonView>();
					originalPupilSize = ZoomyEyesPlugin.DefaultNormalPupilSize.Value;
					if ((Object)(object)photonView != (Object)null)
					{
						int viewID = photonView.ViewID;
						bool isMine = photonView.IsMine;
						PupilStateManager.SetPlayerEyes(viewID, playerEyes, isMine);
					}
					string text = "unknown";
					if ((Object)(object)photonView != (Object)null && photonView.Owner != null)
					{
						text = photonView.Owner.NickName ?? photonView.Owner.ActorNumber.ToString();
					}
					ZoomyEyesPlugin.Log.LogInfo((object)("EyeZoomController initialized for player: " + ((Object)component).name + " (ID: " + text + ")"));
					ZoomyEyesPlugin.DebugLog($"Original pupil size captured: {originalPupilSize}");
				}
			}
			catch (Exception ex)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error in EyeZoomController.Awake: " + ex.Message));
			}
		}

		private void Update()
		{
			try
			{
				if (ZoomyEyesPlugin.IsInMainMenu())
				{
					return;
				}
				if (Time.time - lastFOVCheckTime > 0.5f)
				{
					if (!isZooming && !isInFOVTransition && (Object)(object)photonView != (Object)null && photonView.IsMine)
					{
						float actualDefaultFOV = GetActualDefaultFOV();
						if (Mathf.Abs(trueCurrentFOV - actualDefaultFOV) > 0.5f)
						{
							trueCurrentFOV = actualDefaultFOV;
							ZoomyEyesPlugin.DebugLog($"Detected FOV change: updated tracked FOV to {actualDefaultFOV:F1}");
						}
					}
					lastFOVCheckTime = Time.time;
				}
				if (isZooming && currentZoomState != targetZoomState)
				{
					previousZoomState = currentZoomState;
					currentZoomState = targetZoomState;
					if ((Object)(object)photonView != (Object)null && photonView.IsMine)
					{
						float targetFOV = CalculateFOVFromZoomState(currentZoomState);
						StartFOVTransition(targetFOV);
						PlayZoomStateChangeSound(previousZoomState, currentZoomState);
					}
					if ((Object)(object)photonView != (Object)null)
					{
						int viewID = photonView.ViewID;
						PupilStateManager.SetZoomState(viewID, zooming: true, currentZoomState, photonView.IsMine);
					}
					ZoomyEyesPlugin.DebugLog($"Transitioned to zoom state: {currentZoomState}");
				}
				if (zoomStateChanged && Time.time - lastScrollNetworkUpdate >= 0.1f)
				{
					if ((Object)(object)photonView != (Object)null && photonView.IsMine && isZooming)
					{
						SyncZoomState();
					}
					zoomStateChanged = false;
				}
				if ((Object)(object)photonView != (Object)null && photonView.IsMine)
				{
					if (isInFOVTransition)
					{
						float num = Time.time - fovTransitionStartTime;
						float num2 = Mathf.Clamp01(num / fovTransitionDuration);
						float num3 = Mathf.SmoothStep(0f, 1f, num2);
						currentFOVValue = Mathf.Lerp(fovStartValue, fovEndValue, num3);
						trueCurrentFOV = currentFOVValue;
						ApplyFOVToAllCameras(currentFOVValue);
						if (num2 >= 1f)
						{
							isInFOVTransition = false;
							currentFOVValue = fovEndValue;
							trueCurrentFOV = fovEndValue;
							ZoomyEyesPlugin.DebugLog($"FOV transition completed: {fovEndValue:F1}");
						}
					}
					else if (isZooming)
					{
						MaintainFOV();
					}
				}
				if (Time.time - lastFOVLogTime > 5f && isZooming && (Object)(object)photonView != (Object)null && photonView.IsMine)
				{
					float cameraDirectFOV = GetCameraDirectFOV();
					ZoomyEyesPlugin.DebugLog($"Current FOV: {cameraDirectFOV:F1}, Target FOV: {trueCurrentFOV:F1}");
					lastFOVLogTime = Time.time;
				}
			}
			catch (Exception ex)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error in EyeZoomController.Update: " + ex.Message));
			}
		}

		public void OnExternalFovChange(float newDefaultFov)
		{
			if (!isZooming)
			{
				trueCurrentFOV = newDefaultFov;
				ApplyFOVToAllCameras(newDefaultFov);
				ZoomyEyesPlugin.DebugLog($"Updated FOV to match external change: {newDefaultFov}");
				return;
			}
			float num = CalculateFOVFromZoomState(currentZoomState);
			if (isInFOVTransition)
			{
				fovEndValue = num;
				ZoomyEyesPlugin.DebugLog($"Updated FOV transition target to: {num}");
			}
			else
			{
				StartFOVTransition(num);
				ZoomyEyesPlugin.DebugLog($"Starting new FOV transition due to external FOV change: {num}");
			}
		}

		public static void UpdateMenuAvatarPupils()
		{
			PupilStateManager.UpdateMenuAvatarPupils();
		}

		private void MaintainFOV()
		{
			if (!(trueCurrentFOV <= 0f))
			{
				ApplyFOVToAllCameras(trueCurrentFOV);
			}
		}

		private void ApplyFOVToAllCameras(float fov)
		{
			foreach (Camera playerCamera in ZoomyEyesPlugin.playerCameras)
			{
				if ((Object)(object)playerCamera != (Object)null)
				{
					playerCamera.fieldOfView = fov;
				}
			}
			if ((Object)(object)Camera.main != (Object)null && !ZoomyEyesPlugin.playerCameras.Contains(Camera.main))
			{
				Camera.main.fieldOfView = fov;
			}
		}

		private float GetActualDefaultFOV()
		{
			if ((Object)(object)CameraZoom.Instance != (Object)null)
			{
				return CameraZoom.Instance.playerZoomDefault;
			}
			foreach (Camera playerCamera in ZoomyEyesPlugin.playerCameras)
			{
				if ((Object)(object)playerCamera != (Object)null && ((Behaviour)playerCamera).enabled)
				{
					return playerCamera.fieldOfView;
				}
			}
			if ((Object)(object)Camera.main != (Object)null)
			{
				return Camera.main.fieldOfView;
			}
			return 70f;
		}

		private void StartFOVTransition(float targetFOV)
		{
			if (Time.time - lastFOVChangeTime < minimumFOVChangeInterval)
			{
				ZoomyEyesPlugin.DebugLog("Ignoring FOV change request - too soon after previous change");
			}
			else
			{
				if (Mathf.Approximately(targetFOV, fovEndValue) && isInFOVTransition)
				{
					return;
				}
				float num = (isInFOVTransition ? currentFOVValue : trueCurrentFOV);
				float cameraDirectFOV = GetCameraDirectFOV();
				if (Mathf.Abs(num - cameraDirectFOV) > 1f)
				{
					ZoomyEyesPlugin.DebugLog($"FOV discrepancy - tracked: {num:F1}, camera: {cameraDirectFOV:F1}");
				}
				if (Mathf.Abs(num - targetFOV) < 0.5f)
				{
					trueCurrentFOV = targetFOV;
					currentFOVValue = targetFOV;
					return;
				}
				if (isInFOVTransition)
				{
					float num2 = Time.time - fovTransitionStartTime;
					float num3 = Mathf.Clamp01(num2 / fovTransitionDuration);
					ZoomyEyesPlugin.DebugLog($"Interrupting FOV transition at progress {num3:P0}, current FOV: {num:F1}");
				}
				fovStartValue = num;
				fovEndValue = targetFOV;
				fovTransitionStartTime = Time.time;
				fovTransitionDuration = 0.3f;
				isInFOVTransition = true;
				lastFOVChangeTime = Time.time;
				trueCurrentFOV = num;
				currentFOVValue = num;
				ZoomyEyesPlugin.DebugLog($"Starting FOV transition: {fovStartValue:F1} -> {fovEndValue:F1} over {fovTransitionDuration:F2}s");
			}
		}

		private float GetCameraDirectFOV()
		{
			foreach (Camera playerCamera in ZoomyEyesPlugin.playerCameras)
			{
				if ((Object)(object)playerCamera != (Object)null && ((Behaviour)playerCamera).enabled)
				{
					return playerCamera.fieldOfView;
				}
			}
			if ((Object)(object)Camera.main != (Object)null)
			{
				return Camera.main.fieldOfView;
			}
			return GetActualDefaultFOV();
		}

		public float GetCurrentFOV()
		{
			if (isInFOVTransition || isZooming)
			{
				return trueCurrentFOV;
			}
			return GetActualDefaultFOV();
		}

		private void PlayZoomStateChangeSound(ZoomyEyesPlugin.ZoomState fromState, ZoomyEyesPlugin.ZoomState toState)
		{
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			if (!ZoomyEyesPlugin.EnableSounds.Value)
			{
				return;
			}
			try
			{
				ZoomyEyesPlugin.SoundTransition soundTransition = ZoomyEyesPlugin.GetSoundTransition(fromState, toState);
				if ((Object)(object)soundTransition.Clip == (Object)null)
				{
					return;
				}
				Vector3 position = ((Component)this).transform.position + new Vector3(0f, 1.7f, 0f);
				if ((Object)(object)photonView != (Object)null && photonView.IsMine)
				{
					if ((Object)(object)Camera.main != (Object)null)
					{
						position = ((Component)Camera.main).transform.position;
					}
					else if (ZoomyEyesPlugin.playerCameras.Count > 0)
					{
						foreach (Camera playerCamera in ZoomyEyesPlugin.playerCameras)
						{
							if ((Object)(object)playerCamera != (Object)null && ((Behaviour)playerCamera).enabled)
							{
								position = ((Component)playerCamera).transform.position;
								break;
							}
						}
					}
				}
				ZoomyEyesPlugin.PlaySoundAtPosition(soundTransition.Clip, position, soundTransition.Pitch, ZoomyEyesPlugin.SoundVolume.Value);
				ZoomyEyesPlugin.DebugLog($"Playing transition sound from {fromState} to {toState} with pitch {soundTransition.Pitch:F1}");
			}
			catch (Exception ex)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error playing zoom sound: " + ex.Message));
			}
		}

		public void SetZoomingWithState(bool zooming, ZoomyEyesPlugin.ZoomState state, bool inverted)
		{
			if (ZoomyEyesPlugin.IsInMainMenu() || ((Object)(object)photonView != (Object)null && photonView.IsMine))
			{
				return;
			}
			previousZoomState = currentZoomState;
			if (zooming && !isZooming)
			{
				if (!hasZoomedOnce)
				{
					originalPupilSize = ZoomyEyesPlugin.DefaultNormalPupilSize.Value;
					trueCurrentFOV = GetActualDefaultFOV();
					hasZoomedOnce = true;
					ZoomyEyesPlugin.DebugLog($"Remote player inversion preference: {inverted}");
					PlaySoundForRemotePlayer(activating: true);
				}
			}
			else if (!zooming && isZooming)
			{
				PlaySoundForRemotePlayer(activating: false);
				state = ZoomyEyesPlugin.ZoomState.Default;
			}
			isZooming = zooming;
			if (zooming)
			{
				if (currentZoomState != state)
				{
					PlayZoomStateChangeSound(currentZoomState, state);
				}
				currentZoomState = state;
				targetZoomState = state;
			}
			if ((Object)(object)photonView != (Object)null)
			{
				int viewID = photonView.ViewID;
				PupilStateManager.SetZoomState(viewID, isZooming, currentZoomState);
			}
			ZoomyEyesPlugin.DebugLog($"Remote player zoom state changed: {isZooming}, state: {currentZoomState}, inversion: {inverted}");
		}

		private void PlaySoundForRemotePlayer(bool activating)
		{
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			if (!ZoomyEyesPlugin.EnableSounds.Value)
			{
				return;
			}
			try
			{
				AudioClip val = (activating ? ZoomyEyesPlugin.DefaultZoomSound : ZoomyEyesPlugin.DefaultUnZoomSound);
				if (!((Object)(object)val == (Object)null))
				{
					Vector3 position = ((Component)this).transform.position + new Vector3(0f, 1.7f, 0f);
					float pitch = (activating ? 1f : 1.1f);
					float volume = (activating ? 1f : 0.4f);
					ZoomyEyesPlugin.PlaySoundAtPosition(val, position, pitch, volume);
					ZoomyEyesPlugin.DebugLog("Playing remote player " + (activating ? "activation" : "deactivation") + " sound");
				}
			}
			catch (Exception ex)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error playing remote player sound: " + ex.Message));
			}
		}

		public void HandleScrollInput()
		{
			if (ZoomyEyesPlugin.IsInMainMenu())
			{
				return;
			}
			float axis = Input.GetAxis("Mouse ScrollWheel");
			if (Mathf.Approximately(axis, 0f))
			{
				return;
			}
			if (Time.time - lastFOVChangeTime < minimumFOVChangeInterval)
			{
				ZoomyEyesPlugin.DebugLog("Ignoring scroll input - too soon after previous change");
				return;
			}
			ZoomyEyesPlugin.ZoomState zoomState = ((axis > 0f) ? ((targetZoomState == ZoomyEyesPlugin.ZoomState.Default) ? ZoomyEyesPlugin.ZoomState.ZoomedIn : ((targetZoomState != ZoomyEyesPlugin.ZoomState.ZoomedOut) ? targetZoomState : ZoomyEyesPlugin.ZoomState.Default)) : ((targetZoomState == ZoomyEyesPlugin.ZoomState.Default) ? ZoomyEyesPlugin.ZoomState.ZoomedOut : ((targetZoomState != ZoomyEyesPlugin.ZoomState.ZoomedIn) ? targetZoomState : ZoomyEyesPlugin.ZoomState.Default)));
			if (zoomState != targetZoomState)
			{
				targetZoomState = zoomState;
				zoomStateChanged = true;
				ZoomyEyesPlugin.DebugLog($"Switching to zoom state: {targetZoomState}");
				if ((Object)(object)photonView != (Object)null && photonView.IsMine)
				{
					int viewID = photonView.ViewID;
					PupilStateManager.SetZoomState(viewID, zooming: true, zoomState, isLocalPlayer: true);
				}
				UpdateMenuAvatarPupils();
			}
		}

		private float CalculateFOVFromZoomState(ZoomyEyesPlugin.ZoomState state)
		{
			float actualDefaultFOV = GetActualDefaultFOV();
			return state switch
			{
				ZoomyEyesPlugin.ZoomState.ZoomedIn => actualDefaultFOV * ZoomyEyesPlugin.ZoomedInFOVMultiplier.Value, 
				ZoomyEyesPlugin.ZoomState.ZoomedOut => actualDefaultFOV * ZoomyEyesPlugin.ZoomedOutFOVMultiplier.Value, 
				_ => actualDefaultFOV * ZoomyEyesPlugin.DefaultZoomFOVMultiplier.Value, 
			};
		}

		private void SyncZoomState()
		{
			if (!isZooming || (Object)(object)photonView == (Object)null || !photonView.IsMine || !PhotonNetwork.IsConnected || !PhotonNetwork.InRoom)
			{
				return;
			}
			try
			{
				bool value = ZoomyEyesPlugin.InvertPupilZoom.Value;
				photonView.RPC("SyncEyeZoom", (RpcTarget)1, new object[7]
				{
					true,
					(int)currentZoomState,
					value,
					ZoomyEyesPlugin.DefaultPupilSize.Value,
					ZoomyEyesPlugin.ZoomedInPupilSize.Value,
					ZoomyEyesPlugin.ZoomedOutPupilSize.Value,
					ZoomyEyesPlugin.DefaultNormalPupilSize.Value
				});
				ZoomyEyesPlugin.DebugLog($"Sent zoom state {currentZoomState} with inversion {value} to other players");
				lastScrollNetworkUpdate = Time.time;
			}
			catch (Exception ex)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error sending zoom state: " + ex.Message));
			}
		}

		public void SetZooming(bool zooming, float currentFOV)
		{
			//IL_02da: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0237: Unknown result type (might be due to invalid IL or missing references)
			//IL_0212: Unknown result type (might be due to invalid IL or missing references)
			//IL_0217: Unknown result type (might be due to invalid IL or missing references)
			//IL_0221: Unknown result type (might be due to invalid IL or missing references)
			//IL_0226: Unknown result type (might be due to invalid IL or missing references)
			//IL_02df: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_023c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0243: Unknown result type (might be due to invalid IL or missing references)
			if (ZoomyEyesPlugin.IsInMainMenu())
			{
				return;
			}
			if (zooming && !isZooming)
			{
				bool value = ZoomyEyesPlugin.InvertPupilZoom.Value;
				if (!hasZoomedOnce)
				{
					originalPupilSize = ZoomyEyesPlugin.DefaultNormalPupilSize.Value;
					trueCurrentFOV = currentFOV;
					hasZoomedOnce = true;
					ZoomyEyesPlugin.DebugLog("**** DEBUG: ZOOM ACTIVATED ****");
					ZoomyEyesPlugin.DebugLog($"Using configured pupil size: {originalPupilSize}");
					ZoomyEyesPlugin.DebugLog($"Current default FOV: {GetActualDefaultFOV()}");
					ZoomyEyesPlugin.DebugLog($"Pupil inversion setting: {value}");
					ZoomyEyesPlugin.DebugLog("--- Camera Details ---");
					foreach (Camera playerCamera in ZoomyEyesPlugin.playerCameras)
					{
						if ((Object)(object)playerCamera != (Object)null)
						{
							ZoomyEyesPlugin.DebugLog($"Camera '{((Object)playerCamera).name}': FOV = {playerCamera.fieldOfView}, Enabled = {((Behaviour)playerCamera).enabled}");
						}
					}
					ZoomyEyesPlugin.DebugLog("---------------------");
				}
				bool flag = Input.GetAxis("Mouse ScrollWheel") > 0f;
				bool flag2 = Input.GetAxis("Mouse ScrollWheel") < 0f;
				if (flag)
				{
					previousZoomState = currentZoomState;
					currentZoomState = ZoomyEyesPlugin.ZoomState.ZoomedIn;
					targetZoomState = ZoomyEyesPlugin.ZoomState.ZoomedIn;
				}
				else if (flag2)
				{
					previousZoomState = currentZoomState;
					currentZoomState = ZoomyEyesPlugin.ZoomState.ZoomedOut;
					targetZoomState = ZoomyEyesPlugin.ZoomState.ZoomedOut;
				}
				else
				{
					previousZoomState = currentZoomState;
					currentZoomState = ZoomyEyesPlugin.ZoomState.Default;
					targetZoomState = ZoomyEyesPlugin.ZoomState.Default;
				}
				if ((Object)(object)photonView != (Object)null && photonView.IsMine && (Object)(object)ZoomyEyesPlugin.DefaultZoomSound != (Object)null)
				{
					Vector3 position = (((Object)(object)Camera.main != (Object)null) ? ((Component)Camera.main).transform.position : (((Component)this).transform.position + Vector3.up * 1.7f));
					ZoomyEyesPlugin.PlaySoundAtPosition(ZoomyEyesPlugin.DefaultZoomSound, position);
				}
			}
			else if (!zooming && isZooming)
			{
				if ((Object)(object)photonView != (Object)null && photonView.IsMine && (Object)(object)ZoomyEyesPlugin.DefaultUnZoomSound != (Object)null)
				{
					Vector3 position2 = (((Object)(object)Camera.main != (Object)null) ? ((Component)Camera.main).transform.position : (((Component)this).transform.position + Vector3.up * 1.7f));
					ZoomyEyesPlugin.PlaySoundAtPosition(ZoomyEyesPlugin.DefaultUnZoomSound, position2, 1.1f, 0.4f);
				}
				ZoomyEyesPlugin.DebugLog($"Returning to normal pupil size: {originalPupilSize}");
			}
			isZooming = zooming;
			if ((Object)(object)photonView != (Object)null)
			{
				int viewID = photonView.ViewID;
				PupilStateManager.SetZoomState(viewID, isZooming, currentZoomState, photonView.IsMine);
			}
			if (!((Object)(object)photonView != (Object)null) || !photonView.IsMine)
			{
				return;
			}
			float num;
			if (zooming)
			{
				num = CalculateFOVFromZoomState(currentZoomState);
			}
			else
			{
				num = GetActualDefaultFOV();
				float num2 = trueCurrentFOV;
				if (!isInFOVTransition || !Mathf.Approximately(fovEndValue, num))
				{
					fovStartValue = num2;
					fovEndValue = num;
					fovTransitionStartTime = Time.time;
					fovTransitionDuration = 0.3f;
					isInFOVTransition = true;
					lastFOVChangeTime = Time.time;
					currentFOVValue = num2;
					ZoomyEyesPlugin.DebugLog($"Z released - Starting FOV transition to current default: {fovStartValue:F1} -> {fovEndValue:F1}");
					UpdateMenuAvatarPupils();
					return;
				}
			}
			StartFOVTransition(num);
			UpdateMenuAvatarPupils();
		}

		[PunRPC]
		public void SyncEyeZoom(bool zooming, int stateValue, bool inverted, float defaultPupilSize, float zoomedInPupilSize, float zoomedOutPupilSize, float normalPupilSize)
		{
			try
			{
				if (!ZoomyEyesPlugin.IsInMainMenu())
				{
					string text = "unknown";
					if ((Object)(object)photonView != (Object)null && photonView.Owner != null)
					{
						text = photonView.Owner.NickName ?? photonView.Owner.ActorNumber.ToString();
					}
					ZoomyEyesPlugin.DebugLog($"Received zoom state: {zooming}, state: {(ZoomyEyesPlugin.ZoomState)stateValue}, inversion: {inverted} from player: {text}");
					ZoomyEyesPlugin.DebugLog($"Received pupil sizes: default={defaultPupilSize:F2}, in={zoomedInPupilSize:F2}, out={zoomedOutPupilSize:F2}");
					if ((Object)(object)photonView != (Object)null)
					{
						int viewID = photonView.ViewID;
						PupilStateManager.SetRemotePupilSizes(viewID, defaultPupilSize, zoomedInPupilSize, zoomedOutPupilSize, normalPupilSize, inverted);
					}
					SetZoomingWithState(zooming, (ZoomyEyesPlugin.ZoomState)stateValue, inverted);
				}
			}
			catch (Exception ex)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error in SyncEyeZoom: " + ex.Message));
			}
		}

		[PunRPC]
		public void SyncDefaultPupilSize(float newSize)
		{
			try
			{
				if (!ZoomyEyesPlugin.IsInMainMenu())
				{
					ZoomyEyesPlugin.DebugLog($"Received default pupil size update: {newSize:F2}");
					if ((Object)(object)photonView != (Object)null)
					{
						int viewID = photonView.ViewID;
						PupilStateManager.SetDefaultSize(viewID, newSize);
					}
				}
			}
			catch (Exception ex)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error in SyncDefaultPupilSize: " + ex.Message));
			}
		}
	}
	public static class PupilStateManager
	{
		public class PlayerPupilState
		{
			public float DefaultPupilSize = 1f;

			public bool HasActiveOverride = false;

			public float OverrideMultiplier = 1f;

			public float OverrideStartTime = 0f;

			public bool IsZooming = false;

			public ZoomyEyesPlugin.ZoomState CurrentZoomState = ZoomyEyesPlugin.ZoomState.Default;

			public bool IsLocalPlayer = false;

			public bool UseInvertedPupils = false;

			public bool IsTransitioning = false;

			public float TransitionStartTime = 0f;

			public float TransitionStartSize = 1f;

			public float TransitionTargetSize = 1f;

			public TransitionType CurrentTransition = TransitionType.None;

			public float TransitionDuration = 0.3f;

			public float CurrentPupilSize = 1f;

			public PlayerEyes PlayerEyes;

			public int TransitionsStarted = 0;

			public int TransitionsCompleted = 0;

			public float LongestTransitionTime = 0f;
		}

		public enum TransitionType
		{
			None,
			ToOverride,
			FromOverride,
			ToZoom,
			FromZoom,
			DefaultSizeChange
		}

		[CompilerGenerated]
		private sealed class <DelayedStartTransition>d__31 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public MonoBehaviour menuBehavior;

			public PlayerEyes menuEyes;

			public FieldInfo pupilSizeField;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <DelayedStartTransition>d__31(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = null;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					menuTransitionCoroutine = menuBehavior.StartCoroutine(TransitionMenuPupils(menuEyes, pupilSizeField));
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <TransitionMenuPupils>d__33 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public PlayerEyes menuEyes;

			public FieldInfo pupilSizeField;

			private float <startSize>5__1;

			private float <targetSize>5__2;

			private float <startTime>5__3;

			private float <duration>5__4;

			private float <initialProgress>5__5;

			private float <beforeValue>5__6;

			private float <afterValue>5__7;

			private float <progress>5__8;

			private float <easedProgress>5__9;

			private float <lastSize>5__10;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <TransitionMenuPupils>d__33(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					isMenuTransitioning = true;
					<startSize>5__1 = menuCurrentPupilSize;
					<targetSize>5__2 = menuTargetPupilSize;
					<startTime>5__3 = Time.time;
					<duration>5__4 = 0.3f;
					<initialProgress>5__5 = 0.1f;
					menuCurrentPupilSize = Mathf.Lerp(<startSize>5__1, <targetSize>5__2, <initialProgress>5__5);
					if ((Object)(object)menuEyes != (Object)null && pupilSizeField != null)
					{
						<beforeValue>5__6 = (float)pupilSizeField.GetValue(menuEyes);
						pupilSizeField.SetValue(menuEyes, menuCurrentPupilSize);
						<afterValue>5__7 = (float)pupilSizeField.GetValue(menuEyes);
						ZoomyEyesPlugin.DebugLog($"Transition INITIAL step: {<beforeValue>5__6:F2} → {<afterValue>5__7:F2} (target: {<targetSize>5__2:F2})");
						if (Mathf.Abs(<afterValue>5__7 - menuCurrentPupilSize) > 0.01f)
						{
							ZoomyEyesPlugin.Log.LogError((object)$"Initial step didn't apply correctly! Expected: {menuCurrentPupilSize:F2}, Got: {<afterValue>5__7:F2}");
							pupilSizeField.SetValue(menuEyes, menuCurrentPupilSize);
						}
					}
					<>2__current = null;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					break;
				case 2:
					<>1__state = -1;
					break;
				}
				if (Time.time - <startTime>5__3 < <duration>5__4)
				{
					if ((Object)(object)menuEyes == (Object)null || (Object)(object)PlayerAvatarMenu.instance == (Object)null)
					{
						isMenuTransitioning = false;
						menuTransitionCoroutine = null;
						return false;
					}
					<progress>5__8 = (Time.time - <startTime>5__3) / <duration>5__4;
					<easedProgress>5__9 = Mathf.SmoothStep(0f, 1f, <progress>5__8);
					<lastSize>5__10 = menuCurrentPupilSize;
					menuCurrentPupilSize = Mathf.Lerp(<startSize>5__1, <targetSize>5__2, <easedProgress>5__9);
					if (Mathf.Abs(<lastSize>5__10 - menuCurrentPupilSize) > 0.01f)
					{
						ZoomyEyesPlugin.DebugLog($"Transition progress {<progress>5__8:P0}: {<lastSize>5__10:F2} → {menuCurrentPupilSize:F2}");
					}
					pupilSizeField.SetValue(menuEyes, menuCurrentPupilSize);
					if (Mathf.Abs(<targetSize>5__2 - menuTargetPupilSize) > 0.01f)
					{
						ZoomyEyesPlugin.DebugLog($"Transition target changed during transition: {<targetSize>5__2:F2} → {menuTargetPupilSize:F2}");
						<startSize>5__1 = menuCurrentPupilSize;
						<targetSize>5__2 = menuTargetPupilSize;
						<startTime>5__3 = Time.time;
					}
					<>2__current = null;
					<>1__state = 2;
					return true;
				}
				if ((Object)(object)menuEyes != (Object)null)
				{
					menuCurrentPupilSize = menuTargetPupilSize;
					pupilSizeField.SetValue(menuEyes, menuCurrentPupilSize);
					ZoomyEyesPlugin.DebugLog($"Transition COMPLETE: final size = {menuCurrentPupilSize:F2}");
				}
				isMenuTransitioning = false;
				menuTransitionCoroutine = null;
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		private static Dictionary<int, PlayerPupilState> playerStates;

		private static FieldInfo pupilSizeMultiplierField;

		private static PlayerAvatarVisuals menuAvatarVisuals;

		private static Coroutine menuTransitionCoroutine;

		private static bool isMenuTransitioning;

		private static float menuCurrentPupilSize;

		private static float menuTargetPupilSize;

		public const float MENU_TRANSITION_DURATION = 0.3f;

		public const float ZOOM_TRANSITION_DURATION = 0.3f;

		public const float OVERRIDE_TRANSITION_DURATION = 3f;

		private const float LOG_THROTTLE_PERIOD = 0.5f;

		private static Dictionary<int, float> lastTransitionLogTime;

		private static Dictionary<int, string> playerNames;

		static PupilStateManager()
		{
			playerStates = new Dictionary<int, PlayerPupilState>();
			isMenuTransitioning = false;
			menuCurrentPupilSize = 1f;
			menuTargetPupilSize = 1f;
			lastTransitionLogTime = new Dictionary<int, float>();
			playerNames = new Dictionary<int, string>();
			pupilSizeMultiplierField = AccessTools.Field(typeof(PlayerEyes), "pupilSizeMultiplier");
			if (pupilSizeMultiplierField == null)
			{
				ZoomyEyesPlugin.Log.LogError((object)"Failed to access pupilSizeMultiplier field via reflection!");
			}
		}

		private static void LogDebug(int playerID, string message, bool forceLog = false)
		{
			if (ZoomyEyesPlugin.EnableDebugLogging.Value || forceLog)
			{
				string text = "";
				text = ((!playerNames.TryGetValue(playerID, out var value)) ? $"[Player {playerID}] " : ("[" + value + "] "));
				ZoomyEyesPlugin.Log.LogInfo((object)(text + message));
			}
		}

		public static PlayerPupilState GetPlayerState(int playerID)
		{
			if (!playerStates.ContainsKey(playerID))
			{
				playerStates[playerID] = new PlayerPupilState();
				playerStates[playerID].DefaultPupilSize = ZoomyEyesPlugin.DefaultNormalPupilSize.Value;
				playerStates[playerID].CurrentPupilSize = ZoomyEyesPlugin.DefaultNormalPupilSize.Value;
				LogDebug(playerID, $"Created new pupil state tracker with size {playerStates[playerID].DefaultPupilSize:F2}", forceLog: true);
			}
			return playerStates[playerID];
		}

		public static void SetOverrideState(int playerID, bool active, float multiplier)
		{
			PlayerPupilState playerState = GetPlayerState(playerID);
			if (active != playerState.HasActiveOverride)
			{
				if (active)
				{
					playerState.HasActiveOverride = true;
					playerState.OverrideMultiplier = multiplier;
					playerState.OverrideStartTime = Time.time;
					LogDebug(playerID, $"OVERRIDE ACTIVATED: multiplier={multiplier:F2}");
					StartTransition(playerID, TransitionType.ToOverride);
				}
				else
				{
					LogDebug(playerID, $"OVERRIDE DEACTIVATED (after {Time.time - playerState.OverrideStartTime:F1}s)");
					playerState.HasActiveOverride = false;
					StartTransition(playerID, TransitionType.FromOverride);
				}
			}
			else if (active && Math.Abs(multiplier - playerState.OverrideMultiplier) > 0.01f)
			{
				LogDebug(playerID, $"Override multiplier changed: {playerState.OverrideMultiplier:F2} → {multiplier:F2}");
				playerState.OverrideMultiplier = multiplier;
				float num = CalculateTargetSize(playerID);
				if (playerState.IsTransitioning)
				{
					LogDebug(playerID, $"  - Updating ongoing transition target: {playerState.TransitionTargetSize:F2} → {num:F2}");
					playerState.TransitionTargetSize = num;
				}
				else
				{
					StartTransition(playerID, TransitionType.ToOverride);
				}
			}
		}

		public static void SetPlayerEyes(int playerID, PlayerEyes eyes, bool isLocalPlayer = false)
		{
			if (!((Object)(object)eyes == (Object)null))
			{
				PlayerPupilState playerState = GetPlayerState(playerID);
				playerState.PlayerEyes = eyes;
				playerState.IsLocalPlayer = isLocalPlayer;
				if (isLocalPlayer)
				{
					playerState.UseInvertedPupils = ZoomyEyesPlugin.InvertPupilZoom.Value;
				}
				if (pupilSizeMultiplierField != null)
				{
					float num = (float)pupilSizeMultiplierField.GetValue(eyes);
					LogDebug(playerID, $"Set player eyes reference with current size: {num:F2}");
				}
				ApplyPupilSize(playerID);
			}
		}

		public static void SetRemotePupilSizes(int playerID, float defaultSize, float zoomedInSize, float zoomedOutSize, float normalSize, bool invertedPupils)
		{
			LogDebug(playerID, $"Setting remote pupil sizes: default={defaultSize:F2}, in={zoomedInSize:F2}, out={zoomedOutSize:F2}, normal={normalSize:F2}");
			ZoomyEyesPlugin.lastKnownFieldValues[$"player_{playerID}_defaultPupilSize"] = defaultSize;
			ZoomyEyesPlugin.lastKnownFieldValues[$"player_{playerID}_zoomedInPupilSize"] = zoomedInSize;
			ZoomyEyesPlugin.lastKnownFieldValues[$"player_{playerID}_zoomedOutPupilSize"] = zoomedOutSize;
			ZoomyEyesPlugin.lastKnownFieldValues[$"player_{playerID}_normalPupilSize"] = normalSize;
			PlayerPupilState playerState = GetPlayerState(playerID);
			playerState.UseInvertedPupils = invertedPupils;
			SetDefaultSize(playerID, normalSize);
		}

		private static float GetRemotePlayerSize(int playerID, string key, float defaultValue)
		{
			string key2 = $"player_{playerID}_{key}";
			if (ZoomyEyesPlugin.lastKnownFieldValues.TryGetValue(key2, out var value))
			{
				return value;
			}
			return defaultValue;
		}

		public static void SetZoomState(int playerID, bool zooming, ZoomyEyesPlugin.ZoomState zoomState, bool isLocalPlayer = false)
		{
			PlayerPupilState playerState = GetPlayerState(playerID);
			playerState.IsLocalPlayer = isLocalPlayer;
			if (zooming != playerState.IsZooming || (zooming && zoomState != playerState.CurrentZoomState))
			{
				bool isZooming = playerState.IsZooming;
				ZoomyEyesPlugin.ZoomState currentZoomState = playerState.CurrentZoomState;
				playerState.IsZooming = zooming;
				playerState.CurrentZoomState = zoomState;
				if (!isZooming && zooming)
				{
					LogDebug(playerID, $"ZOOM ACTIVATED: state={zoomState}");
					StartTransition(playerID, TransitionType.ToZoom);
					UpdateMenuAvatarPupils();
				}
				else if (isZooming && !zooming)
				{
					LogDebug(playerID, "ZOOM DEACTIVATED");
					StartTransition(playerID, TransitionType.FromZoom);
					UpdateMenuAvatarPupils();
				}
				else if (isZooming && zooming && currentZoomState != zoomState)
				{
					LogDebug(playerID, $"Zoom state changed: {currentZoomState} → {zoomState}");
					StartTransition(playerID, TransitionType.ToZoom);
					UpdateMenuAvatarPupils();
				}
			}
		}

		public static void SetDefaultSize(int playerID, float size)
		{
			PlayerPupilState playerState = GetPlayerState(playerID);
			if (Math.Abs(size - playerState.DefaultPupilSize) > 0.01f)
			{
				float defaultPupilSize = playerState.DefaultPupilSize;
				playerState.DefaultPupilSize = size;
				if (!playerState.HasActiveOverride && !playerState.IsZooming)
				{
					StartTransition(playerID, TransitionType.DefaultSizeChange);
					LogDebug(playerID, "  - Starting transition to new default size");
				}
				else
				{
					LogDebug(playerID, $"  - Not transitioning (override={playerState.HasActiveOverride}, zooming={playerState.IsZooming})");
				}
				UpdateMenuAvatarPupils();
			}
		}

		private static void StartTransition(int playerID, TransitionType transitionType)
		{
			PlayerPupilState playerState = GetPlayerState(playerID);
			float num = CalculateTargetSize(playerID);
			if (Math.Abs(num - playerState.CurrentPupilSize) < 0.01f)
			{
				LogDebug(playerID, $"  - Skipping transition (already at target size: {num:F2})");
				return;
			}
			float num2;
			switch (transitionType)
			{
			case TransitionType.ToOverride:
			case TransitionType.FromOverride:
				num2 = 3f;
				break;
			case TransitionType.ToZoom:
			case TransitionType.FromZoom:
				num2 = 0.3f;
				break;
			default:
				num2 = 0.3f;
				break;
			}
			playerState.IsTransitioning = true;
			playerState.TransitionStartTime = Time.time;
			playerState.TransitionStartSize = playerState.CurrentPupilSize;
			playerState.TransitionTargetSize = num;
			playerState.CurrentTransition = transitionType;
			playerState.TransitionDuration = num2;
			playerState.TransitionsStarted++;
			LogDebug(playerID, $"TRANSITION STARTED: {transitionType} | {playerState.TransitionStartSize:F2} → {num:F2} (duration: {num2:F1}s)");
			LogDebug(playerID, $"  - Current state: override={playerState.HasActiveOverride}, zooming={playerState.IsZooming}, zoom state={playerState.CurrentZoomState}");
			string text = "";
			text = (playerState.HasActiveOverride ? $"override active (multiplier={playerState.OverrideMultiplier:F2})" : ((!playerState.IsZooming) ? "default size" : $"zooming (state={playerState.CurrentZoomState})"));
			LogDebug(playerID, "  - Target determination: " + text);
		}

		private static float CalculateTargetSize(int playerID)
		{
			PlayerPupilState playerState = GetPlayerState(playerID);
			if (playerState.HasActiveOverride)
			{
				return 1f * playerState.OverrideMultiplier;
			}
			if (playerState.IsZooming)
			{
				if (playerState.UseInvertedPupils)
				{
					switch (playerState.CurrentZoomState)
					{
					case ZoomyEyesPlugin.ZoomState.ZoomedIn:
						if (!playerState.IsLocalPlayer)
						{
							return GetRemotePlayerSize(playerID, "zoomedOutPupilSize", ZoomyEyesPlugin.ZoomedOutPupilSize.Value);
						}
						return ZoomyEyesPlugin.ZoomedOutPupilSize.Value;
					case ZoomyEyesPlugin.ZoomState.ZoomedOut:
						if (!playerState.IsLocalPlayer)
						{
							return GetRemotePlayerSize(playerID, "zoomedInPupilSize", ZoomyEyesPlugin.ZoomedInPupilSize.Value);
						}
						return ZoomyEyesPlugin.ZoomedInPupilSize.Value;
					default:
						if (!playerState.IsLocalPlayer)
						{
							return GetRemotePlayerSize(playerID, "defaultPupilSize", ZoomyEyesPlugin.DefaultPupilSize.Value);
						}
						return ZoomyEyesPlugin.DefaultPupilSize.Value;
					}
				}
				switch (playerState.CurrentZoomState)
				{
				case ZoomyEyesPlugin.ZoomState.ZoomedIn:
					if (!playerState.IsLocalPlayer)
					{
						return GetRemotePlayerSize(playerID, "zoomedInPupilSize", ZoomyEyesPlugin.ZoomedInPupilSize.Value);
					}
					return ZoomyEyesPlugin.ZoomedInPupilSize.Value;
				case ZoomyEyesPlugin.ZoomState.ZoomedOut:
					if (!playerState.IsLocalPlayer)
					{
						return GetRemotePlayerSize(playerID, "zoomedOutPupilSize", ZoomyEyesPlugin.ZoomedOutPupilSize.Value);
					}
					return ZoomyEyesPlugin.ZoomedOutPupilSize.Value;
				default:
					if (!playerState.IsLocalPlayer)
					{
						return GetRemotePlayerSize(playerID, "defaultPupilSize", ZoomyEyesPlugin.DefaultPupilSize.Value);
					}
					return ZoomyEyesPlugin.DefaultPupilSize.Value;
				}
			}
			return playerState.DefaultPupilSize;
		}

		public static float CalculatePupilSize(int playerID)
		{
			PlayerPupilState playerState = GetPlayerState(playerID);
			if (playerState.IsTransitioning)
			{
				float num = Time.time - playerState.TransitionStartTime;
				float num2 = Mathf.Clamp01(num / playerState.TransitionDuration);
				float num3 = Mathf.SmoothStep(0f, 1f, num2);
				float num4 = (playerState.CurrentPupilSize = Mathf.Lerp(playerState.TransitionStartSize, playerState.TransitionTargetSize, num3));
				if (ZoomyEyesPlugin.EnableDebugLogging.Value)
				{
					if (!lastTransitionLogTime.ContainsKey(playerID))
					{
						lastTransitionLogTime[playerID] = 0f;
					}
					if (Time.time - lastTransitionLogTime[playerID] > 0.5f)
					{
						LogDebug(playerID, $"  Transition progress: {num2:P0} | Current size: {num4:F2}");
						lastTransitionLogTime[playerID] = Time.time;
					}
				}
				if (num2 >= 1f)
				{
					playerState.IsTransitioning = false;
					playerState.CurrentTransition = TransitionType.None;
					playerState.TransitionsCompleted++;
					float num5 = Time.time - playerState.TransitionStartTime;
					if (num5 > playerState.LongestTransitionTime)
					{
						playerState.LongestTransitionTime = num5;
					}
					LogDebug(playerID, $"TRANSITION COMPLETE: {playerState.TransitionStartSize:F2} → {playerState.TransitionTargetSize:F2} in {num5:F2}s");
				}
			}
			else if (!playerState.IsTransitioning)
			{
				float num6 = CalculateTargetSize(playerID);
				if (Math.Abs(num6 - playerState.CurrentPupilSize) > 0.01f)
				{
					LogDebug(playerID, $"Pupil size drift detected: {playerState.CurrentPupilSize:F2} vs target {num6:F2}", forceLog: true);
					StartTransition(playerID, TransitionType.None);
				}
			}
			return playerState.CurrentPupilSize;
		}

		public static bool IsPlayerInTransition(int playerID)
		{
			return playerStates.ContainsKey(playerID) && playerStates[playerID].IsTransitioning;
		}

		public static void ApplyPupilSize(int playerID)
		{
			PlayerPupilState playerState = GetPlayerState(playerID);
			if (!((Object)(object)playerState.PlayerEyes == (Object)null) && !(pupilSizeMultiplierField == null))
			{
				float num = CalculatePupilSize(playerID);
				pupilSizeMultiplierField.SetValue(playerState.PlayerEyes, num);
			}
		}

		public static void ApplyPupilSizesToAllPlayers()
		{
			if (ZoomyEyesPlugin.IsInMainMenu())
			{
				return;
			}
			try
			{
				foreach (KeyValuePair<int, PlayerPupilState> playerState in playerStates)
				{
					int key = playerState.Key;
					ApplyPupilSize(key);
				}
			}
			catch (Exception ex)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error applying pupil sizes to all players: " + ex.Message));
			}
		}

		public static void UpdateMenuAvatarPupils()
		{
			try
			{
				if ((Object)(object)MenuManager.instance == (Object)null)
				{
					return;
				}
				if ((Object)(object)menuAvatarVisuals == (Object)null || (Object)(object)menuAvatarVisuals.playerEyes == (Object)null)
				{
					if (!((Object)(object)PlayerAvatarMenu.instance != (Object)null))
					{
						ZoomyEyesPlugin.DebugLog("PlayerAvatarMenu.instance is null, cannot find menu avatar visuals");
						return;
					}
					menuAvatarVisuals = ((Component)PlayerAvatarMenu.instance).GetComponentInChildren<PlayerAvatarVisuals>();
					ZoomyEyesPlugin.Log.LogInfo((object)("Found menu avatar visuals: " + (((Object)(object)menuAvatarVisuals != (Object)null) ? "yes" : "no")));
				}
				if ((Object)(object)menuAvatarVisuals == (Object)null || (Object)(object)menuAvatarVisuals.playerEyes == (Object)null || pupilSizeMultiplierField == null)
				{
					ZoomyEyesPlugin.DebugLog("Cannot update menu avatar pupils: missing references");
					return;
				}
				float num = (float)pupilSizeMultiplierField.GetValue(menuAvatarVisuals.playerEyes);
				float currentPupilSizeForMenu = GetCurrentPupilSizeForMenu();
				if (ZoomyEyesPlugin.EnableDebugLogging.Value)
				{
					FieldInfo field = typeof(PlayerAvatarPatch).GetField("wasZKeyPressed", BindingFlags.Static | BindingFlags.NonPublic);
					bool flag = false;
					if (field != null)
					{
						flag = (bool)field.GetValue(null);
					}
					ZoomyEyesPlugin.DebugLog($"Menu pupil update: wasZKeyPressed={flag}, realSize={num:F2}, targetSize={currentPupilSizeForMenu:F2}, currentMenuTarget={menuTargetPupilSize:F2}");
					PlayerAvatar val = FindLocalPlayer();
					if ((Object)(object)val != (Object)null)
					{
						PhotonView photonView = val.photonView;
						int num2 = ((photonView != null) ? photonView.ViewID : (-1));
						if (num2 >= 0 && playerStates.ContainsKey(num2))
						{
							PlayerPupilState playerPupilState = playerStates[num2];
							ZoomyEyesPlugin.DebugLog($"  Player state: IsZooming={playerPupilState.IsZooming}, ZoomState={playerPupilState.CurrentZoomState}, CurrentSize={playerPupilState.CurrentPupilSize:F2}");
						}
					}
				}
				if (Mathf.Abs(menuTargetPupilSize - currentPupilSizeForMenu) < 0.01f)
				{
					if (Mathf.Abs(num - menuTargetPupilSize) > 0.05f && !isMenuTransitioning)
					{
						ZoomyEyesPlugin.DebugLog($"Menu avatar pupil was changed externally: {num:F2}, forcing initial step toward {menuTargetPupilSize:F2}");
						float num3 = Mathf.Lerp(num, menuTargetPupilSize, 0.2f);
						pupilSizeMultiplierField.SetValue(menuAvatarVisuals.playerEyes, num3);
						menuCurrentPupilSize = num3;
						float num4 = (float)pupilSizeMultiplierField.GetValue(menuAvatarVisuals.playerEyes);
						if (Mathf.Abs(num4 - num3) > 0.01f)
						{
							ZoomyEyesPlugin.Log.LogError((object)$"Initial correction didn't apply! Expected: {num3:F2}, Got: {num4:F2}");
						}
					}
					return;
				}
				float num5 = menuTargetPupilSize;
				menuTargetPupilSize = currentPupilSizeForMenu;
				menuCurrentPupilSize = num;
				if (isMenuTransitioning)
				{
					ZoomyEyesPlugin.DebugLog($"Transition already in progress, target updated: {num5:F2} -> {menuTargetPupilSize:F2}");
					return;
				}
				if ((Object)(object)PlayerAvatarMenu.instance != (Object)null)
				{
					MonoBehaviour instance = (MonoBehaviour)(object)PlayerAvatarMenu.instance;
					if ((Object)(object)instance != (Object)null)
					{
						if (menuTransitionCoroutine != null)
						{
							instance.StopCoroutine(menuTransitionCoroutine);
							menuTransitionCoroutine = null;
						}
						float num6 = Mathf.Lerp(menuCurrentPupilSize, menuTargetPupilSize, 0.15f);
						pupilSizeMultiplierField.SetValue(menuAvatarVisuals.playerEyes, num6);
						menuCurrentPupilSize = num6;
						instance.StartCoroutine(DelayedStartTransition(instance, menuAvatarVisuals.playerEyes, pupilSizeMultiplierField));
					}
					else
					{
						float num7 = Mathf.Lerp(menuCurrentPupilSize, menuTargetPupilSize, 0.2f);
						pupilSizeMultiplierField.SetValue(menuAvatarVisuals.playerEyes, num7);
						menuCurrentPupilSize = num7;
						ZoomyEyesPlugin.DebugLog($"Applied initial step: {menuCurrentPupilSize:F2} (no coroutine available)");
					}
				}
				else
				{
					ZoomyEyesPlugin.DebugLog("Cannot start transition: PlayerAvatarMenu.instance is null");
				}
				ZoomyEyesPlugin.DebugLog($"Updated menu avatar pupil target to: {menuTargetPupilSize:F2}");
			}
			catch (Exception ex)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error updating menu avatar pupils: " + ex.Message));
			}
		}

		[IteratorStateMachine(typeof(<DelayedStartTransition>d__31))]
		private static IEnumerator DelayedStartTransition(MonoBehaviour menuBehavior, PlayerEyes menuEyes, FieldInfo pupilSizeField)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <DelayedStartTransition>d__31(0)
			{
				menuBehavior = menuBehavior,
				menuEyes = menuEyes,
				pupilSizeField = pupilSizeField
			};
		}

		private static float GetCurrentPupilSizeForMenu()
		{
			try
			{
				FieldInfo field = typeof(PlayerAvatarPatch).GetField("wasZKeyPressed", BindingFlags.Static | BindingFlags.NonPublic);
				bool flag = false;
				if (field != null)
				{
					flag = (bool)field.GetValue(null);
				}
				if (!flag)
				{
					ZoomyEyesPlugin.DebugLog($"Menu avatar: not zooming, using normal size: {ZoomyEyesPlugin.DefaultNormalPupilSize.Value:F2}");
					return ZoomyEyesPlugin.DefaultNormalPupilSize.Value;
				}
				PlayerAvatar val = FindLocalPlayer();
				if ((Object)(object)val != (Object)null)
				{
					PhotonView photonView = val.photonView;
					int num = ((photonView != null) ? photonView.ViewID : (-1));
					if (num >= 0 && playerStates.ContainsKey(num))
					{
						PlayerPupilState playerPupilState = playerStates[num];
						float num2 = (playerPupilState.UseInvertedPupils ? (playerPupilState.CurrentZoomState switch
						{
							ZoomyEyesPlugin.ZoomState.ZoomedIn => ZoomyEyesPlugin.ZoomedOutPupilSize.Value, 
							ZoomyEyesPlugin.ZoomState.ZoomedOut => ZoomyEyesPlugin.ZoomedInPupilSize.Value, 
							_ => ZoomyEyesPlugin.DefaultPupilSize.Value, 
						}) : (playerPupilState.CurrentZoomState switch
						{
							ZoomyEyesPlugin.ZoomState.ZoomedIn => ZoomyEyesPlugin.ZoomedInPupilSize.Value, 
							ZoomyEyesPlugin.ZoomState.ZoomedOut => ZoomyEyesPlugin.ZoomedOutPupilSize.Value, 
							_ => ZoomyEyesPlugin.DefaultPupilSize.Value, 
						}));
						ZoomyEyesPlugin.DebugLog($"Menu avatar: zooming with state {playerPupilState.CurrentZoomState}, using size: {num2:F2}");
						return num2;
					}
				}
				ZoomyEyesPlugin.DebugLog($"Menu avatar: using default zoom size: {ZoomyEyesPlugin.DefaultPupilSize.Value:F2}");
				return ZoomyEyesPlugin.DefaultPupilSize.Value;
			}
			catch (Exception ex)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error getting menu pupil size: " + ex.Message));
				return ZoomyEyesPlugin.DefaultNormalPupilSize.Value;
			}
		}

		[IteratorStateMachine(typeof(<TransitionMenuPupils>d__33))]
		private static IEnumerator TransitionMenuPupils(PlayerEyes menuEyes, FieldInfo pupilSizeField)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <TransitionMenuPupils>d__33(0)
			{
				menuEyes = menuEyes,
				pupilSizeField = pupilSizeField
			};
		}

		private static PlayerAvatar FindLocalPlayer()
		{
			PlayerAvatar[] array = Object.FindObjectsOfType<PlayerAvatar>();
			PlayerAvatar[] array2 = array;
			foreach (PlayerAvatar val in array2)
			{
				if ((Object)(object)val != (Object)null && (Object)(object)val.photonView != (Object)null && val.photonView.IsMine)
				{
					return val;
				}
			}
			return null;
		}

		public static void ApplyNormalPupilSizeToAll()
		{
			try
			{
				if (ZoomyEyesPlugin.IsInMainMenu())
				{
					return;
				}
				float value = ZoomyEyesPlugin.DefaultNormalPupilSize.Value;
				List<PlayerAvatar> list = SemiFunc.PlayerGetAll();
				foreach (PlayerAvatar item in list)
				{
					if ((Object)(object)item.photonView != (Object)null)
					{
						int viewID = item.photonView.ViewID;
						SetDefaultSize(viewID, value);
					}
				}
				UpdateMenuAvatarPupils();
				ZoomyEyesPlugin.DebugLog($"Applied normal pupil size to all players: {value}");
			}
			catch (Exception ex)
			{
				ZoomyEyesPlugin.Log.LogError((object)("Error applying normal pupil size: " + ex.Message));
			}
		}

		public static void LogAllPlayerStates()
		{
			ZoomyEyesPlugin.Log.LogInfo((object)"=== PUPIL STATE MANAGER - ALL PLAYER STATES ===");
			foreach (KeyValuePair<int, PlayerPupilState> playerState in playerStates)
			{
				int key = playerState.Key;
				PlayerPupilState value = playerState.Value;
				string text = (playerNames.ContainsKey(key) ? playerNames[key] : $"Player {key}");
				ZoomyEyesPlugin.Log.LogInfo((object)(text + ":"));
				ZoomyEyesPlugin.Log.LogInfo((object)$"  Default Size: {value.DefaultPupilSize:F2}");
				ZoomyEyesPlugin.Log.LogInfo((object)$"  Override: {value.HasActiveOverride} (multiplier: {value.OverrideMultiplier:F2})");
				ZoomyEyesPlugin.Log.LogInfo((object)$"  Zoom: {value.IsZooming} (state: {value.CurrentZoomState})");
				ZoomyEyesPlugin.Log.LogInfo((object)$"  Transition: {value.IsTransitioning} (type: {value.CurrentTransition})");
				ZoomyEyesPlugin.Log.LogInfo((object)$"  Current Size: {value.CurrentPupilSize:F2}");
				ZoomyEyesPlugin.Log.LogInfo((object)$"  Stats: {value.TransitionsStarted} started, {value.TransitionsCompleted} completed");
				ZoomyEyesPlugin.Log.LogInfo((object)$"  Longest transition: {value.LongestTransitionTime:F2}s");
			}
			ZoomyEyesPlugin.Log.LogInfo((object)"=================================================");
		}

		private static void LogDetailedState(int playerID)
		{
			if (!playerStates.ContainsKey(playerID))
			{
				ZoomyEyesPlugin.Log.LogInfo((object)$"[PUPIL DIAGNOSTICS] No state exists for player {playerID}");
				return;
			}
			PlayerPupilState playerPupilState = playerStates[playerID];
			string text = (playerNames.ContainsKey(playerID) ? playerNames[playerID] : $"Player {playerID}");
			ZoomyEyesPlugin.Log.LogInfo((object)("=== PUPIL DIAGNOSTICS FOR " + text + " ==="));
			ZoomyEyesPlugin.Log.LogInfo((object)$"Current pupil size: {playerPupilState.CurrentPupilSize:F2}");
			ZoomyEyesPlugin.Log.LogInfo((object)$"Default pupil size: {playerPupilState.DefaultPupilSize:F2}");
			ZoomyEyesPlugin.Log.LogInfo((object)$"Is zooming: {playerPupilState.IsZooming}");
			ZoomyEyesPlugin.Log.LogInfo((object)$"Zoom state: {playerPupilState.CurrentZoomState}");
			ZoomyEyesPlugin.Log.LogInfo((object)$"Has override: {playerPupilState.HasActiveOverride}");
			ZoomyEyesPlugin.Log.LogInfo((object)$"Override multiplier: {playerPupilState.OverrideMultiplier:F2}");
			ZoomyEyesPlugin.Log.LogInfo((object)$"Is transitioning: {playerPupilState.IsTransitioning}");
			if (playerPupilState.IsTransitioning)
			{
				float num = Time.time - playerPupilState.TransitionStartTime;
				float num2 = Mathf.Clamp01(num / playerPupilState.TransitionDuration);
				ZoomyEyesPlugin.Log.LogInfo((object)$"Transition type: {playerPupilState.CurrentTransition}");
				ZoomyEyesPlugin.Log.LogInfo((object)$"Transition start size: {playerPupilState.TransitionStartSize:F2}");
				ZoomyEyesPlugin.Log.LogInfo((object)$"Transition target size: {playerPupilState.TransitionTargetSize:F2}");
				ZoomyEyesPlugin.Log.LogInfo((object)$"Transition progress: {num2:P0} ({num:F2}s elapsed)");
				ZoomyEyesPlugin.Log.LogInfo((object)$"Transition start time: {playerPupilState.TransitionStartTime:F2}");
				ZoomyEyesPlugin.Log.LogInfo((object)$"Current time: {Time.time:F2}");
			}
			ZoomyEyesPlugin.Log.LogInfo((object)$"Target calculated size (current priority): {CalculateTargetSize(playerID):F2}");
			ZoomyEyesPlugin.Log.LogInfo((object)"===========================================");
		}
	}
}
namespace ZoomyEyes.Config
{
	public static class PupilSliderConfig
	{
		public static Vector3 SliderPosition = new Vector3(445f, 745f, 0f);

		public static Color SliderBackgroundColor = new Color(0f, 0f, 0f, 0.63f);

		public static Color SliderBarColor = Color.grey;

		public static string SliderName = "Pupil Size";

		public static float MinPupilSize = 0.2f;

		public

plugins/SomeEmotesREPO.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("")]
[assembly: AssemblyCompany("ImGogole")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.4.0")]
[assembly: AssemblyInformationalVersion("1.0.4+28906c51394ffff726c4bb8da0cdba07ec3a4e6e")]
[assembly: AssemblyProduct("SomeEmotesREPO")]
[assembly: AssemblyTitle("SomeEmotesREPO")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.4.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.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;
		}
	}
}
[Serializable]
public class Preferences
{
	public List<string> farovites = new List<string>();

	public KeyCode panelKey = (KeyCode)112;
}
namespace SomeEmotesREPO
{
	[HarmonyPatch(typeof(PlayerAvatar))]
	internal class AddEmoteSystemPatch
	{
		[HarmonyPostfix]
		[HarmonyPatch("Start")]
		private static void Start_Postfix(PlayerAvatar __instance)
		{
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			if (GameManager.Multiplayer())
			{
				if (Object.op_Implicit((Object)(object)GameManager.instance) && GameManager.instance.connectRandom)
				{
					SomeEmotesREPO.Logger.LogWarning((object)"CAUTION ! You are using a mod in a public lobby, people who doesn't have the mod and yourself can have some errors due to compatibility.");
				}
				EmoteSystem emoteSystem = ((Component)__instance).GetComponent<EmoteSystem>();
				if (!Object.op_Implicit((Object)(object)emoteSystem))
				{
					emoteSystem = ((Component)__instance).gameObject.AddComponent<EmoteSystem>();
				}
				emoteSystem.SetPlayerAvatar(__instance);
				if (__instance.photonView.IsMine)
				{
					SomeEmotesREPO.Logger.LogInfo((object)$"EmoteSystem has been added to the player. Press [{EmoteLoader.PanelKey}] to see the Emote Panel.");
				}
			}
			else
			{
				SomeEmotesREPO.Logger.LogInfo((object)"Not in a multiplayer game : ignored.");
			}
		}
	}
	[HarmonyPatch(typeof(GameDirector))]
	internal class AddPatchGameDirector
	{
		[HarmonyPrefix]
		[HarmonyPatch("DeathStart")]
		private static void DeathStart_Prefix()
		{
			if (EmoteSystem.Ready && EmoteSystem.Instance.IsEmoting)
			{
				EmoteSystem.Instance.StopEmote();
			}
		}
	}
	[HarmonyPatch(typeof(PlayerExpression))]
	internal class AddPatchPlayerExpression
	{
		[HarmonyPrefix]
		[HarmonyPatch("DoExpression")]
		private static bool DoExpression_Prefix()
		{
			return !BlockBecauseEmoteIsPlaying();
		}

		[HarmonyPrefix]
		[HarmonyPatch("ToggleExpression")]
		private static bool ToggleExpression_Prefix()
		{
			return !BlockBecauseEmoteIsPlaying();
		}

		private static bool BlockBecauseEmoteIsPlaying()
		{
			return EmoteSystem.Ready && EmoteSystem.Instance.IsEmoting;
		}
	}
	public static class EmoteBundleLoader
	{
		private static AssetBundle emoteBundle;

		public static AssetBundle Load(string path)
		{
			if ((Object)(object)emoteBundle == (Object)null)
			{
				emoteBundle = AssetBundle.LoadFromFile(path);
				if ((Object)(object)emoteBundle == (Object)null)
				{
					SomeEmotesREPO.Logger.LogError((object)"EmoteBundle is not found");
				}
			}
			return emoteBundle;
		}

		public static void Unload()
		{
			if ((Object)(object)emoteBundle != (Object)null)
			{
				emoteBundle.Unload(true);
				emoteBundle = null;
			}
		}

		public static T LoadAsset<T>(string name) where T : Object
		{
			if ((Object)(object)emoteBundle == (Object)null)
			{
				return default(T);
			}
			name = name.ToLower();
			string[] allAssetNames = emoteBundle.GetAllAssetNames();
			string[] array = allAssetNames;
			foreach (string text in array)
			{
				if (text.ToLower().EndsWith(name))
				{
					return emoteBundle.LoadAsset<T>(text);
				}
			}
			return default(T);
		}

		public static List<string> GetAllAnimNames()
		{
			List<string> list = new List<string>();
			string[] allAssetNames = emoteBundle.GetAllAssetNames();
			foreach (string text in allAssetNames)
			{
				if (text.EndsWith(".anim"))
				{
					list.Add(text);
				}
			}
			return list;
		}
	}
	public class EmoteLauncher : MonoBehaviour
	{
		public Animator animator;

		public EmoteSystem emoteSystem;

		public List<string> emoteNames = new List<string>();

		private Dictionary<string, AnimationClip> animationDict = new Dictionary<string, AnimationClip>();

		private AnimatorOverrideController overrideController;

		private string overrideKeyName = "Placeholder";

		private float initialRot;

		private Transform targetPlayer;

		private GameObject visuals;

		private GameObject spotlight;

		public SkinnedMeshRenderer leg_R;

		public SkinnedMeshRenderer leg_L;

		public SkinnedMeshRenderer body_bot;

		public SkinnedMeshRenderer body_top_sphere;

		public SkinnedMeshRenderer arm_L;

		public SkinnedMeshRenderer arm_R;

		public SkinnedMeshRenderer health_LED;

		public SkinnedMeshRenderer health_frame;

		public SkinnedMeshRenderer health_shadow;

		public SkinnedMeshRenderer head_bot_sphere;

		public SkinnedMeshRenderer head_bot_flat;

		public SkinnedMeshRenderer head_top;

		public SkinnedMeshRenderer eye_L;

		public SkinnedMeshRenderer iris_L;

		public SkinnedMeshRenderer eye_R;

		public SkinnedMeshRenderer iris_R;

		public List<string> EmoteNames => emoteNames;

		public void AddEntry(string name, AnimationClip clip)
		{
			animationDict.Add(name, clip);
		}

		public void Init(Transform target)
		{
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Expected O, but got Unknown
			targetPlayer = target;
			visuals = ((Component)((Component)this).transform.GetChild(0)).gameObject;
			spotlight = ((Component)((Component)this).transform.GetChild(1)).gameObject;
			animator = ((Component)this).GetComponentInChildren<Animator>();
			overrideController = new AnimatorOverrideController(animator.runtimeAnimatorController);
			animator.runtimeAnimatorController = (RuntimeAnimatorController)(object)overrideController;
			foreach (KeyValuePair<string, AnimationClip> item in animationDict)
			{
				emoteNames.Add(item.Key);
			}
			InitBones();
			InitLight();
			visuals.SetActive(false);
			spotlight.SetActive(false);
		}

		private void Update()
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)targetPlayer))
			{
				((Component)this).transform.position = targetPlayer.position;
			}
		}

		private void LateUpdate()
		{
			//IL_002d: 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_004d: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)emoteSystem) && emoteSystem.IsEmoting)
			{
				((Component)this).transform.eulerAngles = new Vector3(((Component)this).transform.eulerAngles.x, initialRot, ((Component)this).transform.eulerAngles.z);
			}
		}

		public void SetFavorites(List<string> favs)
		{
			if (favs != null && favs.Count != 0)
			{
				List<string> list = favs.Where(emoteNames.Contains).Distinct().ToList();
				if (list.Count != 0)
				{
					emoteNames.RemoveAll(list.Contains);
					emoteNames.InsertRange(0, list);
					EmoteLoader.Instance.emotesName = new List<string>(emoteNames);
					int count = Math.Min(8, emoteNames.Count);
					List<string> favorites = emoteNames.Take(count).ToList();
					EmoteLoader.Instance.SetFavorites(favorites);
				}
			}
		}

		public void SetRotation(float _initialRot)
		{
			initialRot = _initialRot;
		}

		public bool Animate(string emoteName)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			if (!animationDict.TryGetValue(emoteName, out AnimationClip value))
			{
				return false;
			}
			((Component)animator).transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity);
			visuals.SetActive(true);
			spotlight.SetActive(true);
			overrideController[overrideKeyName] = value;
			animator.ResetTrigger("StopEmote");
			animator.SetTrigger("TriggerEmote");
			return true;
		}

		public void StopEmote()
		{
			visuals.SetActive(false);
			spotlight.SetActive(false);
			animator.SetTrigger("StopEmote");
		}

		private void InitLight()
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			Light val = spotlight.AddComponent<Light>();
			((Component)val).transform.localPosition = Vector3.up * 2.5f;
			((Component)val).transform.localEulerAngles = -Vector3.left * 90f;
			val.type = (LightType)0;
			val.innerSpotAngle = 35f;
			val.spotAngle = 40f;
			val.color = new Color(1f, 0.97f, 0.84f);
			val.intensity = 1.75f;
			val.bounceIntensity = 1f;
			val.range = 5f;
			val.shadows = (LightShadows)0;
			val.cullingMask = -1;
		}

		private void InitBones()
		{
			leg_R = ((Component)FindDeepChild(((Component)this).transform, "leg_R_0")).GetComponent<SkinnedMeshRenderer>();
			leg_L = ((Component)FindDeepChild(((Component)this).transform, "leg_L_0")).GetComponent<SkinnedMeshRenderer>();
			body_bot = ((Component)FindDeepChild(((Component)this).transform, "body_bot_0")).GetComponent<SkinnedMeshRenderer>();
			body_top_sphere = ((Component)FindDeepChild(((Component)this).transform, "body_top_sphere_0")).GetComponent<SkinnedMeshRenderer>();
			arm_L = ((Component)FindDeepChild(((Component)this).transform, "arm_L_0")).GetComponent<SkinnedMeshRenderer>();
			arm_R = ((Component)FindDeepChild(((Component)this).transform, "arm_R_0")).GetComponent<SkinnedMeshRenderer>();
			health_LED = ((Component)FindDeepChild(((Component)this).transform, "health_LED_0")).GetComponent<SkinnedMeshRenderer>();
			health_frame = ((Component)FindDeepChild(((Component)this).transform, "health_frame_0")).GetComponent<SkinnedMeshRenderer>();
			health_shadow = ((Component)FindDeepChild(((Component)this).transform, "health_shadow_0")).GetComponent<SkinnedMeshRenderer>();
			head_bot_sphere = ((Component)FindDeepChild(((Component)this).transform, "head_bot_sphere_0")).GetComponent<SkinnedMeshRenderer>();
			head_bot_flat = ((Component)FindDeepChild(((Component)this).transform, "head_bot_flat_0")).GetComponent<SkinnedMeshRenderer>();
			head_top = ((Component)FindDeepChild(((Component)this).transform, "head_top_0")).GetComponent<SkinnedMeshRenderer>();
			eye_L = ((Component)FindDeepChild(((Component)this).transform, "eye_L_0")).GetComponent<SkinnedMeshRenderer>();
			iris_L = ((Component)FindDeepChild(((Component)this).transform, "iris_L_0")).GetComponent<SkinnedMeshRenderer>();
			eye_R = ((Component)FindDeepChild(((Component)this).transform, "eye_R_0")).GetComponent<SkinnedMeshRenderer>();
			iris_R = ((Component)FindDeepChild(((Component)this).transform, "iris_R_0")).GetComponent<SkinnedMeshRenderer>();
		}

		public void InitTexturesFrom(GameObject initial)
		{
			if ((Object)(object)leg_R != (Object)null)
			{
				((Renderer)leg_R).materials = GetMaterialsFromBone(initial, "mesh_leg_r");
			}
			if ((Object)(object)leg_L != (Object)null)
			{
				((Renderer)leg_L).materials = GetMaterialsFromBone(initial, "mesh_leg_l");
			}
			if ((Object)(object)body_bot != (Object)null)
			{
				((Renderer)body_bot).materials = GetMaterialsFromBone(initial, "mesh_body_bot");
			}
			if ((Object)(object)body_top_sphere != (Object)null)
			{
				((Renderer)body_top_sphere).materials = GetMaterialsFromBone(initial, "mesh_body_top_sphere");
			}
			if ((Object)(object)arm_L != (Object)null)
			{
				((Renderer)arm_L).materials = GetMaterialsFromBone(initial, "mesh_arm_l");
			}
			if ((Object)(object)arm_R != (Object)null)
			{
				((Renderer)arm_R).materials = GetMaterialsFromBone(initial, "mesh_arm_r");
			}
			if ((Object)(object)health_LED != (Object)null)
			{
				((Renderer)health_LED).materials = GetMaterialsFromBone(initial, "mesh_health");
			}
			if ((Object)(object)health_frame != (Object)null)
			{
				((Renderer)health_frame).materials = GetMaterialsFromBone(initial, "mesh_health frame");
			}
			if ((Object)(object)health_shadow != (Object)null)
			{
				((Renderer)health_shadow).materials = GetMaterialsFromBone(initial, "mesh_health shadow");
			}
			if ((Object)(object)head_bot_sphere != (Object)null)
			{
				((Renderer)head_bot_sphere).materials = GetMaterialsFromBone(initial, "mesh_head_bot_sphere");
			}
			if ((Object)(object)head_bot_flat != (Object)null)
			{
				((Renderer)head_bot_flat).materials = GetMaterialsFromBone(initial, "mesh_head_bot_flat");
			}
			if ((Object)(object)head_top != (Object)null)
			{
				((Renderer)head_top).materials = GetMaterialsFromBone(initial, "mesh_head_top");
			}
			if ((Object)(object)eye_L != (Object)null)
			{
				((Renderer)eye_L).materials = GetMaterialsFromBone(initial, "mesh_eye_l");
			}
			if ((Object)(object)iris_L != (Object)null)
			{
				((Renderer)iris_L).materials = GetMaterialsFromBone(initial, "mesh_pupil_l");
			}
			if ((Object)(object)eye_R != (Object)null)
			{
				((Renderer)eye_R).materials = GetMaterialsFromBone(initial, "mesh_eye_r");
			}
			if ((Object)(object)iris_R != (Object)null)
			{
				((Renderer)iris_R).materials = GetMaterialsFromBone(initial, "mesh_pupil_r");
			}
		}

		private Material[] GetMaterialsFromBone(GameObject initial, string name)
		{
			Transform val = FindDeepChild(initial.transform, name);
			if ((Object)(object)val != (Object)null)
			{
				return ((Renderer)((Component)val).GetComponent<MeshRenderer>()).materials;
			}
			return null;
		}

		private Transform FindDeepChild(Transform parent, string childName)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Expected O, but got Unknown
			foreach (Transform item in parent)
			{
				Transform val = item;
				if (((Object)val).name.ToLower() == childName.ToLower())
				{
					return val;
				}
				Transform val2 = FindDeepChild(val, childName);
				if ((Object)(object)val2 != (Object)null)
				{
					return val2;
				}
			}
			return null;
		}
	}
	public class EmoteLoader : MonoBehaviour
	{
		private AssetBundle assetBundle;

		private static EmoteLoader instance;

		public List<string> emotesName = new List<string>();

		private Preferences emotesPreferences;

		public static EmoteLoader Instance => instance;

		public static KeyCode PanelKey => (KeyCode)((!((Object)(object)instance != (Object)null) || instance.emotesPreferences == null) ? 112 : ((int)instance.emotesPreferences.panelKey));

		public int TotalPages => Mathf.CeilToInt((float)(emotesName.Count / 8));

		private void Awake()
		{
			instance = this;
		}

		private void Start()
		{
			string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
			string path = Path.Combine(directoryName, "emotes.bundle");
			assetBundle = EmoteBundleLoader.Load(path);
			string path2 = Path.Combine(directoryName, "preferences.json");
			try
			{
				string text = File.ReadAllText(path2);
				emotesPreferences = JsonUtility.FromJson<Preferences>(text);
			}
			catch
			{
				SomeEmotesREPO.Logger.LogInfo((object)"No preferences file found, creating one.");
				emotesPreferences = new Preferences();
				SavePreferences();
			}
		}

		public static Font GetFont()
		{
			return instance.assetBundle.LoadAllAssets<Font>().First((Font f) => ((Object)f).name.ToLower().Contains("teko-regular"));
		}

		public void SavePreferences()
		{
			string path = Path.Combine(Paths.PluginPath, "ImGogole-SomeEmotesREPO", "preferences.json");
			string contents = JsonUtility.ToJson((object)emotesPreferences);
			File.WriteAllText(path, contents);
		}

		public void SetFavorites(List<string> favs)
		{
			emotesPreferences.farovites = favs;
			SavePreferences();
		}

		public EmoteLauncher LoadEmote(PlayerAvatar playerAvatar)
		{
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)assetBundle == (Object)null)
			{
				SomeEmotesREPO.Logger.LogError((object)"Unable to load emotes.bundle");
				return null;
			}
			emotesName.Clear();
			GameObject val = EmoteBundleLoader.LoadAsset<GameObject>("emote.prefab");
			if ((Object)(object)val == (Object)null)
			{
				SomeEmotesREPO.Logger.LogError((object)"Prefab emote not found");
				return null;
			}
			GameObject val2 = Object.Instantiate<GameObject>(val, Vector3.zero, Quaternion.identity);
			EmoteLauncher emoteLauncher = val2.AddComponent<EmoteLauncher>();
			List<string> allAnimNames = EmoteBundleLoader.GetAllAnimNames();
			foreach (string item in allAnimNames)
			{
				string text = ExtractElement(item);
				if (!string.IsNullOrWhiteSpace(text))
				{
					emoteLauncher.AddEntry(text, EmoteBundleLoader.LoadAsset<AnimationClip>(item));
					emotesName.Add(text);
				}
			}
			emoteLauncher.Init(((Component)playerAvatar).transform);
			emoteLauncher.SetFavorites(emotesPreferences.farovites);
			emoteLauncher.InitTexturesFrom(((Component)((Component)playerAvatar).transform.parent).gameObject);
			return emoteLauncher;
		}

		public static string ExtractElement(string path)
		{
			if (string.IsNullOrWhiteSpace(path))
			{
				return string.Empty;
			}
			string text = path.Trim();
			int num = text.LastIndexOf('/');
			if (num >= 0)
			{
				text = text.Substring(num + 1);
			}
			if (text.EndsWith(".anim", StringComparison.OrdinalIgnoreCase))
			{
				text = text.Substring(0, text.Length - ".anim".Length);
			}
			return text;
		}
	}
	public class EmoteSelectionManager : MonoBehaviour
	{
		private static EmoteSelectionManager instance;

		private bool visible = false;

		private int currentPage = 0;

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

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

		public const int emotePerPages = 8;

		public const int LineHeigth = 30;

		public const string delimiter = "-----------------------------";

		public GUIStyle style;

		public List<string> Lines => lines;

		public List<string> EmotesToPlay => emotesToPlay;

		public bool Visible => visible;

		public static EmoteSelectionManager Instance => instance;

		private void Awake()
		{
			instance = this;
			SomeEmotesREPO.Logger.LogInfo((object)"EmoteSelectionManager ready.");
		}

		public void SetVisible(bool isVisible)
		{
			visible = isVisible;
			if (visible)
			{
				OpenPanel(0);
			}
		}

		public void OpenPanel(int page)
		{
			currentPage = page;
			UpdateLines();
		}

		private void Update()
		{
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			if (ChatManager.instance.chatActive || !Visible)
			{
				return;
			}
			if (currentPage > 0 && Input.GetKeyDown((KeyCode)276))
			{
				OpenPanel(currentPage - 1);
			}
			if (currentPage < EmoteLoader.Instance.TotalPages && Input.GetKeyDown((KeyCode)275))
			{
				OpenPanel(currentPage + 1);
			}
			for (int i = 0; i < emotesToPlay.Count; i++)
			{
				KeyCode val = (KeyCode)(49 + i);
				KeyCode val2 = (KeyCode)(257 + i);
				bool flag = Input.GetKeyDown(val) || Input.GetKeyDown(val2);
				bool flag2 = Input.GetKey((KeyCode)308) || Input.GetKey((KeyCode)307) || Input.GetKey((KeyCode)313);
				if (flag)
				{
					if (flag2)
					{
						EmoteSystem.Instance.SetFavorite(emotesToPlay[i]);
						UpdateLines();
					}
					else
					{
						EmoteSystem.Instance.PlayEmote(emotesToPlay[i]);
					}
				}
			}
		}

		private void UpdateLines()
		{
			//IL_0225: Unknown result type (might be due to invalid IL or missing references)
			lines.Clear();
			emotesToPlay.Clear();
			List<string> list = EmoteSystem.Instance.FetchEmotes(currentPage * 8, 8);
			if (currentPage == 0)
			{
				lines.Add("Favorite emotes");
				lines.Add("-----------------------------");
				if (list.Count > 0)
				{
					for (int i = 0; i < list.Count; i++)
					{
						lines.Add($"[{i + 1}] {list[i]}");
						emotesToPlay.Add(list[i]);
					}
				}
				else
				{
					lines.Add("No emote yet");
				}
				lines.Add("-----------------------------");
				lines.Add("Press [->] for next page");
			}
			else
			{
				lines.Add($"Page {currentPage + 1}/{EmoteLoader.Instance.TotalPages + 1}");
				lines.Add("-----------------------------");
				for (int j = 0; j < list.Count; j++)
				{
					lines.Add($"[{j + 1}] {list[j]}");
					emotesToPlay.Add(list[j]);
				}
				lines.Add("-----------------------------");
				if (EmoteLoader.Instance.TotalPages > currentPage)
				{
					lines.Add("Press [->] for next page");
				}
				lines.Add("Press [<-] for previous page");
			}
			if (list.Count > 0)
			{
				lines.Add("Press [Num] to emote");
				lines.Add("Press [Alt + Num] to add to favorite");
			}
			lines.Add($"Press [{EmoteLoader.PanelKey}] to quit");
		}

		private void OnGUI()
		{
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			if (!EmoteSystem.Ready || !Visible || Lines.Count == 0)
			{
				return;
			}
			if (style == null)
			{
				style = GUI.skin.GetStyle("label");
				style.fontSize = 22;
				style.font = EmoteLoader.GetFont();
				style.richText = true;
			}
			float num = (float)Screen.height - 8f - (float)(Lines.Count * 30);
			foreach (string line in Lines)
			{
				GUI.Label(new Rect(8f, num, (float)Screen.width - 16f, 30f), line, style);
				num += 30f;
			}
		}
	}
	public class EmoteSystem : MonoBehaviourPun
	{
		private bool isEmoting = false;

		private int emoteId = -1;

		private float emoteTime = 0f;

		private float initialRot = 0f;

		private bool ready = false;

		private Transform camTransform;

		private PlayerAvatar playerAvatar;

		private PlayerAvatarVisuals playerVisuals;

		private static float initalCamOffset = 3.25f;

		private static float camOffset = initalCamOffset;

		private static EmoteSystem instance;

		private EmoteLauncher emoteLauncher;

		private Animator animator;

		public static bool Ready
		{
			get
			{
				if (!Object.op_Implicit((Object)(object)instance))
				{
					return false;
				}
				return instance.ready;
			}
		}

		public bool IsEmoting
		{
			get
			{
				return isEmoting;
			}
			set
			{
				isEmoting = value;
				if (isEmoting)
				{
					emoteTime = 0f;
				}
			}
		}

		public static EmoteSystem Instance => instance;

		private PhotonView PV => playerVisuals.playerAvatar.photonView;

		private void Awake()
		{
			ready = false;
			if ((Object)(object)Camera.main != (Object)null)
			{
				camTransform = ((Component)Camera.main).transform;
			}
		}

		public List<string> FetchEmotes(int startIndex, int count)
		{
			return emoteLauncher.EmoteNames.Skip(Math.Max(startIndex, 0)).Take(Math.Max(count, 0)).ToList();
		}

		public void SetFavorite(string fav)
		{
			SetFavorites(new List<string> { fav });
		}

		public void SetFavorites(List<string> favs)
		{
			emoteLauncher.SetFavorites(favs);
		}

		public void SetPlayerAvatar(PlayerAvatar pa)
		{
			playerAvatar = pa;
			((MonoBehaviour)this).StartCoroutine(SetVisuals());
		}

		private IEnumerator SetVisuals()
		{
			yield return (object)new WaitForSeconds(0.75f);
			if ((Object)(object)playerAvatar != (Object)null)
			{
				playerVisuals = playerAvatar.playerAvatarVisuals;
				if ((Object)(object)playerVisuals == (Object)null)
				{
					playerVisuals = ((Component)((Component)playerAvatar).transform.parent).GetComponentInChildren<PlayerAvatarVisuals>();
					animator = ((Component)playerVisuals).GetComponentInChildren<Animator>();
				}
			}
			if (PV.IsMine)
			{
				instance = this;
			}
			if (GameManager.Multiplayer())
			{
				emoteLauncher = EmoteLoader.Instance.LoadEmote(playerAvatar);
				emoteLauncher.emoteSystem = this;
			}
			ready = true;
		}

		public void PlayEmote(string emoteId)
		{
			if (PV.IsMine)
			{
				EmoteSelectionManager.Instance.SetVisible(isVisible: false);
				IsEmoting = true;
				((MonoBehaviourPun)this).photonView.RPC("RPC_PlayEmote", (RpcTarget)0, new object[2] { emoteId, initialRot });
			}
		}

		public void StopEmote()
		{
			if (PV.IsMine)
			{
				EmoteSelectionManager.Instance.SetVisible(isVisible: false);
				IsEmoting = false;
				((MonoBehaviourPun)this).photonView.RPC("RPC_StopEmote", (RpcTarget)0, Array.Empty<object>());
			}
		}

		[PunRPC]
		private void RPC_PlayEmote(string emoteId, float _initialRot)
		{
			IsEmoting = true;
			emoteLauncher.SetRotation(_initialRot);
			emoteLauncher.Animate(emoteId);
			SomeEmotesREPO.Logger.LogInfo((object)("[" + ((MonoBehaviourPun)this).photonView.Owner.NickName + "] played emote " + emoteId + "."));
		}

		[PunRPC]
		private void RPC_StopEmote()
		{
			IsEmoting = false;
			emoteLauncher.StopEmote();
		}

		private void Update()
		{
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: 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_01c1: Unknown result type (might be due to invalid IL or missing references)
			if (!ready)
			{
				return;
			}
			if (IsEmoting)
			{
				emoteTime += Time.deltaTime;
				if (IsPlayerTakeControlBack())
				{
					IsEmoting = false;
					StopEmote();
				}
			}
			if (PV.IsMine && Object.op_Implicit((Object)(object)camTransform))
			{
				if (isEmoting)
				{
					camTransform.localPosition = new Vector3(0f, 0f, 0f - camOffset);
				}
				else
				{
					camTransform.localPosition = Vector3.zero;
				}
				float y = Input.mouseScrollDelta.y;
				if (y != 0f)
				{
					camOffset -= y * Time.deltaTime * 20f;
					camOffset = Mathf.Clamp(camOffset, 0.5f, 4f);
				}
			}
			if (Object.op_Implicit((Object)(object)playerVisuals))
			{
				if (PV.IsMine && !playerAvatar.deadSet && Input.GetKeyDown(EmoteLoader.PanelKey) && !ChatManager.instance.chatActive)
				{
					EmoteSelectionManager.Instance.SetVisible(!EmoteSelectionManager.Instance.Visible);
				}
				if (!PV.IsMine)
				{
					((Behaviour)animator).enabled = !IsEmoting;
					playerVisuals.meshParent.SetActive(!IsEmoting);
				}
				else
				{
					initialRot = ((Component)playerAvatar).transform.eulerAngles.y;
				}
			}
		}

		public bool IsPlayerTakeControlBack()
		{
			//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)
			if (!PV.IsMine)
			{
				return false;
			}
			Vector2 movement = InputManager.instance.GetMovement();
			if (((Vector2)(ref movement)).sqrMagnitude > 0.01f)
			{
				return true;
			}
			if (InputManager.instance.KeyDown((InputKey)1) || InputManager.instance.KeyDown((InputKey)2) || InputManager.instance.KeyDown((InputKey)15) || InputManager.instance.KeyDown((InputKey)12) || InputManager.instance.KeyDown((InputKey)14))
			{
				return true;
			}
			return false;
		}

		public void OnDestroy()
		{
			if ((Object)(object)emoteLauncher != (Object)null)
			{
				Object.Destroy((Object)(object)((Component)emoteLauncher).gameObject);
			}
		}
	}
	[HarmonyPatch(typeof(FlashlightController))]
	internal class FlashlightControllerPatch
	{
		[HarmonyPrefix]
		[HarmonyPatch("Update")]
		private static bool Update_Prefix(FlashlightController __instance)
		{
			EmoteSystem component = ((Component)__instance.PlayerAvatar).GetComponent<EmoteSystem>();
			if ((Object)(object)component == (Object)null)
			{
				return true;
			}
			if (component.IsEmoting)
			{
				((Renderer)__instance.mesh).enabled = false;
				((Behaviour)__instance.spotlight).enabled = false;
				__instance.halo.enabled = false;
				__instance.LightActive = false;
				return false;
			}
			return true;
		}
	}
	public static class HierarchyLogger
	{
		public static void LogFullHierarchy(GameObject go)
		{
			Transform val = go.transform;
			while ((Object)(object)val.parent != (Object)null)
			{
				val = val.parent;
			}
			StringBuilder stringBuilder = new StringBuilder();
			BuildHierarchyString(val, 0, stringBuilder, go.transform);
			SomeEmotesREPO.Logger.LogInfo((object)stringBuilder.ToString());
		}

		private static void BuildHierarchyString(Transform t, int indent, StringBuilder sb, Transform initial)
		{
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Expected O, but got Unknown
			sb.Append(' ', indent * 2);
			string text = (((Object)(object)t == (Object)(object)initial) ? " [INITIAL GAME OBJECT]" : "");
			Component[] components = ((Component)t).GetComponents<Component>();
			string text2 = string.Join(", ", from c in components
				where !(c is Transform)
				select ((object)c).GetType().Name);
			if (!string.IsNullOrEmpty(text2))
			{
				text2 = " [" + text2 + "]";
			}
			sb.AppendLine("- " + ((Object)t).name + text + text2);
			foreach (Transform item in t)
			{
				Transform t2 = item;
				BuildHierarchyString(t2, indent + 1, sb, initial);
			}
		}
	}
	[HarmonyPatch(typeof(PlayerAvatarVisuals), "Update")]
	internal static class PlayerAvatarVisualsUpdatePatch
	{
		private static bool Prefix(PlayerAvatarVisuals __instance)
		{
			if ((Object)(object)__instance.playerAvatar != (Object)null && __instance.playerAvatar.photonView.IsMine && (Object)(object)EmoteSystem.Instance != (Object)null && EmoteSystem.Instance.IsEmoting)
			{
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(PlayerAvatarVisuals), "Revive")]
	internal static class PlayerAvatarVisualsRevivePatch
	{
		private static void Prefix(PlayerAvatarVisuals __instance)
		{
			EmoteSystem.Instance.StopEmote();
		}
	}
	[HarmonyPatch(typeof(PlayerNameChecker))]
	internal class PlayerNameCheckerPatch
	{
		[HarmonyPrefix]
		[HarmonyPatch("Update")]
		public static void Update_Prefix(PlayerNameChecker __instance)
		{
			if (Object.op_Implicit((Object)(object)EmoteSystem.Instance) && EmoteSystem.Instance.IsEmoting)
			{
				__instance.checkTimer = 0.25f;
			}
		}
	}
	[BepInPlugin("ImGogole.SomeEmotesREPO", "SomeEmotesREPO", "1.0.4")]
	public class SomeEmotesREPO : BaseUnityPlugin
	{
		internal static SomeEmotesREPO Instance { get; private set; }

		internal static ManualLogSource Logger => Instance._logger;

		private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger;

		internal Harmony? Harmony { get; set; }

		private void Awake()
		{
			Instance = this;
			((Component)this).gameObject.transform.parent = null;
			((Object)((Component)this).gameObject).hideFlags = (HideFlags)61;
			if (!Object.op_Implicit((Object)(object)((Component)this).GetComponent<EmoteSelectionManager>()))
			{
				((Component)this).gameObject.AddComponent<EmoteSelectionManager>();
			}
			if (!Object.op_Implicit((Object)(object)((Component)this).GetComponent<EmoteLoader>()))
			{
				((Component)this).gameObject.AddComponent<EmoteLoader>();
			}
			Patch();
			Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!");
		}

		internal void Patch()
		{
			//IL_001a: 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_0021: Expected O, but got Unknown
			//IL_0026: Expected O, but got Unknown
			if (Harmony == null)
			{
				Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID);
				Harmony val2 = val;
				Harmony = val;
			}
			Harmony.PatchAll();
		}

		internal void Unpatch()
		{
			Harmony? harmony = Harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
		}
	}
}
namespace SomeEmotesREPO.Utils
{
	public static class ChatReflection
	{
		private static readonly FieldRef<ChatManager, bool> _chatActiveGetter = AccessTools.FieldRefAccess<ChatManager, bool>("chatActive");

		public static bool IsChatActive()
		{
			if ((Object)(object)ChatManager.instance == (Object)null)
			{
				return false;
			}
			return _chatActiveGetter.Invoke(ChatManager.instance);
		}
	}
}