Decompiled source of Haunted v1.2.0

Haunted.dll

Decompiled 6 days 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 BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Animations;
using UnityEngine.SceneManagement;

[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("Haunted")]
[assembly: AssemblyTitle("Haunted")]
[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 RepoMods.DuplicatePlayers
{
	public static class DuplicatePlayersPatcher
	{
		public static void Apply(Harmony harmony)
		{
			harmony.PatchAll(typeof(DuplicatePlayersPatcher).Assembly);
			Debug.Log((object)"[DuplicatePlayers] Patches applied.");
		}

		[RuntimeInitializeOnLoadMethod(/*Could not decode attribute arguments.*/)]
		private static void RuntimeInit()
		{
			SceneGuard.EnsureHooked();
			LobbyLogGate.Ensure();
		}
	}
	public static class Settings
	{
		public static bool IncludeLocalForTesting = true;

		public static bool ForceGameplayCheck = false;

		public static bool PreferLevelSpawnPoints = true;
	}
	public static class CloneTiming
	{
		public static readonly float MinSeconds = 30f;

		public static readonly float MaxSeconds = 60f;

		public static readonly float PostGenDelay = 10f;
	}
	public class LocalCloneMarker : MonoBehaviour
	{
	}
	public class CloneAnimationEventSink : MonoBehaviour
	{
		public void FootstepLight()
		{
		}

		public void PlayFootstep()
		{
		}

		public void Land()
		{
		}

		public void SlideStart()
		{
		}

		public void SlideStop()
		{
		}

		public void Roll()
		{
		}

		public void Jump()
		{
		}
	}
	public class CloneCollisionLocalizer : MonoBehaviour
	{
		private CharacterController _cc;

		private readonly HashSet<Collider> _currentlyIgnored = new HashSet<Collider>();

		private float _nextRefreshAt;

		private void Awake()
		{
			_cc = ((Component)this).GetComponent<CharacterController>();
		}

		private void OnEnable()
		{
			RefreshIgnores(fullReset: true);
			_nextRefreshAt = Time.time + 1f;
		}

		private void Update()
		{
			if (Time.time >= _nextRefreshAt)
			{
				_nextRefreshAt = Time.time + 1f;
				RefreshIgnores(fullReset: false);
			}
		}

		internal void RefreshIgnores(bool fullReset)
		{
			if ((Object)(object)_cc == (Object)null || (Object)(object)CloneManager.Instance == (Object)null)
			{
				return;
			}
			List<Collider> list = new List<Collider>(64);
			List<Collider> list2 = new List<Collider>(16);
			foreach (PlayerAvatar item in CloneManager.Instance.LiveAvatars())
			{
				if ((Object)(object)item == (Object)null || (Object)(object)((Component)item).GetComponent<PlayerAvatarMenu>() != (Object)null)
				{
					continue;
				}
				bool flag = Patch_PlayerAvatar_Start.IsLocalPlayer(item);
				Collider[] componentsInChildren = ((Component)item).GetComponentsInChildren<Collider>(true);
				if (componentsInChildren != null && componentsInChildren.Length != 0)
				{
					if (flag)
					{
						list2.AddRange(componentsInChildren);
					}
					else
					{
						list.AddRange(componentsInChildren);
					}
				}
			}
			if (fullReset)
			{
				Collider[] array = _currentlyIgnored.ToArray();
				foreach (Collider val in array)
				{
					if ((Object)(object)val == (Object)null)
					{
						_currentlyIgnored.Remove(val);
						continue;
					}
					Physics.IgnoreCollision((Collider)(object)_cc, val, false);
					_currentlyIgnored.Remove(val);
				}
			}
			for (int j = 0; j < list.Count; j++)
			{
				Collider val2 = list[j];
				if (!((Object)(object)val2 == (Object)null) && _currentlyIgnored.Add(val2))
				{
					Physics.IgnoreCollision((Collider)(object)_cc, val2, true);
				}
			}
			for (int k = 0; k < list2.Count; k++)
			{
				Collider val3 = list2[k];
				if (!((Object)(object)val3 == (Object)null))
				{
					if (_currentlyIgnored.Remove(val3))
					{
						Physics.IgnoreCollision((Collider)(object)_cc, val3, false);
					}
					else
					{
						Physics.IgnoreCollision((Collider)(object)_cc, val3, false);
					}
				}
			}
		}
	}
	public class LobbyLogGate : MonoBehaviour
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static LogCallback <0>__OnLog;
		}

		private static LobbyLogGate _instance;

		private static float _autoClearAt = -1f;

		public static bool IsBlocking { get; private set; }

		public static void Ensure()
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Expected O, but got Unknown
			if (!((Object)(object)_instance != (Object)null))
			{
				GameObject val = new GameObject("[DuplicatePlayers] LobbyLogGate");
				Object.DontDestroyOnLoad((Object)(object)val);
				_instance = val.AddComponent<LobbyLogGate>();
			}
		}

		private void OnEnable()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			object obj = <>O.<0>__OnLog;
			if (obj == null)
			{
				LogCallback val = OnLog;
				<>O.<0>__OnLog = val;
				obj = (object)val;
			}
			Application.logMessageReceived += (LogCallback)obj;
		}

		private void OnDisable()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			object obj = <>O.<0>__OnLog;
			if (obj == null)
			{
				LogCallback val = OnLog;
				<>O.<0>__OnLog = val;
				obj = (object)val;
			}
			Application.logMessageReceived -= (LogCallback)obj;
		}

		private static void OnLog(string condition, string stackTrace, LogType type)
		{
			if (!string.IsNullOrEmpty(condition) && condition.IndexOf("Unlocking lobby", StringComparison.OrdinalIgnoreCase) >= 0)
			{
				IsBlocking = true;
				_autoClearAt = Time.time + 60f;
				Debug.Log((object)"[DuplicatePlayers] LobbyLogGate: blocking due to 'Unlocking lobby'.");
			}
		}

		private void Update()
		{
			LevelGenerator instance = LevelGenerator.Instance;
			if (IsBlocking && (Object)(object)instance != (Object)null && instance.Generated && SceneGuard.GeneratedTrueAt > 0f && Time.time - SceneGuard.GeneratedTrueAt >= CloneTiming.PostGenDelay)
			{
				IsBlocking = false;
				_autoClearAt = -1f;
				Debug.Log((object)"[DuplicatePlayers] LobbyLogGate: unblocked after level generation + delay.");
			}
			if (IsBlocking && _autoClearAt > 0f && Time.time >= _autoClearAt)
			{
				IsBlocking = false;
				_autoClearAt = -1f;
				Debug.LogWarning((object)"[DuplicatePlayers] LobbyLogGate: auto-cleared after timeout.");
			}
		}
	}
	public class SceneGuard : MonoBehaviour
	{
		private static SceneGuard _instance;

		private bool _lastGenerated;

		internal static float GeneratedTrueAt = -1f;

		public static void EnsureHooked()
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Expected O, but got Unknown
			if (!((Object)(object)_instance != (Object)null))
			{
				GameObject val = new GameObject("[DuplicatePlayers] SceneGuard");
				Object.DontDestroyOnLoad((Object)(object)val);
				_instance = val.AddComponent<SceneGuard>();
			}
		}

		private void OnEnable()
		{
			SceneManager.activeSceneChanged += OnSceneChanged;
		}

		private void OnDisable()
		{
			SceneManager.activeSceneChanged -= OnSceneChanged;
		}

		private void OnSceneChanged(Scene from, Scene to)
		{
			LocalCloneMarker[] array = Object.FindObjectsOfType<LocalCloneMarker>(true);
			for (int i = 0; i < array.Length; i++)
			{
				if ((Object)(object)array[i] != (Object)null)
				{
					Object.Destroy((Object)(object)((Component)array[i]).gameObject);
				}
			}
			_lastGenerated = false;
			GeneratedTrueAt = -1f;
			if ((Object)(object)CloneManager.Instance != (Object)null)
			{
				CloneManager.Instance.RequestRescheduleSoon();
			}
		}

		private void Update()
		{
			LevelGenerator instance = LevelGenerator.Instance;
			bool flag = (Object)(object)instance != (Object)null && instance.Generated;
			if (flag && !_lastGenerated)
			{
				GeneratedTrueAt = Time.time;
				Debug.Log((object)$"[DuplicatePlayers] LevelGenerator.Generated true at t={GeneratedTrueAt:F1}");
			}
			_lastGenerated = flag;
		}
	}
	internal static class LocalKillUtil
	{
		public static void TryKillLocal()
		{
			try
			{
				ChatManager val = ChatManager.instance ?? Object.FindObjectOfType<ChatManager>(true);
				if ((Object)(object)val != (Object)null)
				{
					val.PossessSelfDestruction();
					Debug.Log((object)"[DuplicatePlayers] Local kill triggered via PossessSelfDestruction().");
				}
				else
				{
					Debug.LogWarning((object)"[DuplicatePlayers] ChatManager not found; cannot self-destruct locally.");
				}
			}
			catch (Exception arg)
			{
				Debug.LogWarning((object)$"[DuplicatePlayers] Local kill failed: {arg}");
			}
		}
	}
	public class IndependentCloneBrain : MonoBehaviour
	{
		[CompilerGenerated]
		private sealed class <TraverseLink>d__57 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public Vector3 end;

			public IndependentCloneBrain <>4__this;

			private Vector3 <dir>5__1;

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

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

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

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

			private bool MoveNext()
			{
				//IL_00d2: 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_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_002b: Unknown result type (might be due to invalid IL or missing references)
				//IL_003b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0040: Unknown result type (might be due to invalid IL or missing references)
				//IL_0045: 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_0094: Unknown result type (might be due to invalid IL or missing references)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					break;
				case 1:
					<>1__state = -1;
					break;
				}
				Vector3 val = new Vector3(end.x, ((Component)<>4__this).transform.position.y, end.z) - ((Component)<>4__this).transform.position;
				if (((Vector3)(ref val)).sqrMagnitude > 0.04f)
				{
					<dir>5__1 = end - ((Component)<>4__this).transform.position;
					<dir>5__1.y = 0f;
					if (((Vector3)(ref <dir>5__1)).sqrMagnitude > 1E-05f)
					{
						((Vector3)(ref <dir>5__1)).Normalize();
						<>4__this.ApplyMove(<dir>5__1 * <>4__this.chaseSpeed);
						<>2__current = null;
						<>1__state = 1;
						return true;
					}
				}
				if ((Object)(object)<>4__this._agent != (Object)null)
				{
					<>4__this._agent.CompleteOffMeshLink();
				}
				<>4__this._traversingLink = 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("Leash / Roam")]
		public Transform leashCenter;

		public float leashRadius = 18f;

		public float roamSpeed = 1f;

		public float turnSpeed = 420f;

		public float idleTimeMin = 0.8f;

		public float idleTimeMax = 2.2f;

		public float waypointMin = 6f;

		public float waypointMax = 14f;

		[Header("Chase")]
		public float chaseRadius = 25f;

		public float giveUpRadius = 35f;

		public float chaseSpeed = 1f;

		public float repathInterval = 0.33f;

		[Header("Physics")]
		public float gravity = 22f;

		public float groundStick = 2f;

		public float slopeLimit = 50f;

		public float stepOffset = 0.25f;

		public float skinWidth = 0.02f;

		[Header("Kill on Touch")]
		public float killTouchRadius = 0.65f;

		public float killCooldown = 1f;

		private float _killReadyAt = 0f;

		private Animator _anim;

		private NavMeshAgent _agent;

		private CharacterController _cc;

		private Vector3 _currentTarget;

		private float _idleUntil;

		private bool _hasTarget;

		private Quaternion _lastRot;

		private float _verticalVel;

		private bool _grounded;

		private Transform _chaseTarget;

		private float _nextRepathAt;

		private static readonly int ID_Moving = Animator.StringToHash("Moving");

		private static readonly int ID_Sprinting = Animator.StringToHash("Sprinting");

		private static readonly int ID_Crouching = Animator.StringToHash("Crouching");

		private static readonly int ID_Crawling = Animator.StringToHash("Crawling");

		private static readonly int ID_Sliding = Animator.StringToHash("Sliding");

		private static readonly int ID_Turning = Animator.StringToHash("Turning");

		private static readonly int ID_Tumbling = Animator.StringToHash("Tumbling");

		private Vector3 _lastWorldPos;

		private float _stuckTimer;

		private bool _traversingLink;

		private void Awake()
		{
			//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_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)
			_anim = ((Component)this).GetComponentInChildren<Animator>();
			if ((Object)(object)_anim != (Object)null)
			{
				_anim.applyRootMotion = false;
				_anim.updateMode = (AnimatorUpdateMode)0;
				_anim.cullingMode = (AnimatorCullingMode)0;
			}
			_cc = ((Component)this).GetComponent<CharacterController>() ?? ((Component)this).gameObject.AddComponent<CharacterController>();
			AutoSizeCharacterController(_cc, ((Component)this).gameObject);
			_cc.slopeLimit = slopeLimit;
			_cc.stepOffset = stepOffset;
			_cc.skinWidth = skinWidth;
			_cc.detectCollisions = true;
			_lastRot = ((Component)this).transform.rotation;
			_lastWorldPos = ((Component)this).transform.position;
			PickIdle();
		}

		private void Update()
		{
			//IL_0022: 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_0027: 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_0041: 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_0251: Unknown result type (might be due to invalid IL or missing references)
			//IL_0227: Unknown result type (might be due to invalid IL or missing references)
			//IL_019f: 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_01f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_0502: Unknown result type (might be due to invalid IL or missing references)
			//IL_0507: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_03f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_03f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_03fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0407: Unknown result type (might be due to invalid IL or missing references)
			//IL_069c: Unknown result type (might be due to invalid IL or missing references)
			//IL_06a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_06ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_06b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_06b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_06c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0588: Unknown result type (might be due to invalid IL or missing references)
			//IL_058d: Unknown result type (might be due to invalid IL or missing references)
			//IL_054f: Unknown result type (might be due to invalid IL or missing references)
			//IL_042c: Unknown result type (might be due to invalid IL or missing references)
			//IL_043a: Unknown result type (might be due to invalid IL or missing references)
			//IL_043f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0441: Unknown result type (might be due to invalid IL or missing references)
			//IL_0449: Unknown result type (might be due to invalid IL or missing references)
			//IL_044e: Unknown result type (might be due to invalid IL or missing references)
			//IL_044f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0451: Unknown result type (might be due to invalid IL or missing references)
			//IL_0456: Unknown result type (might be due to invalid IL or missing references)
			//IL_045b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0469: Unknown result type (might be due to invalid IL or missing references)
			//IL_046e: Unknown result type (might be due to invalid IL or missing references)
			//IL_047c: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_06f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0706: Unknown result type (might be due to invalid IL or missing references)
			//IL_070b: Unknown result type (might be due to invalid IL or missing references)
			//IL_070d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0715: Unknown result type (might be due to invalid IL or missing references)
			//IL_071a: Unknown result type (might be due to invalid IL or missing references)
			//IL_071b: Unknown result type (might be due to invalid IL or missing references)
			//IL_071d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0722: Unknown result type (might be due to invalid IL or missing references)
			//IL_0727: Unknown result type (might be due to invalid IL or missing references)
			//IL_0735: Unknown result type (might be due to invalid IL or missing references)
			//IL_073a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0748: Unknown result type (might be due to invalid IL or missing references)
			//IL_05bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_05c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_05c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_05d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_05e2: 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_05a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_05b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_05b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_048f: Unknown result type (might be due to invalid IL or missing references)
			//IL_049a: Unknown result type (might be due to invalid IL or missing references)
			//IL_049f: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_030f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0314: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0614: 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_061b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0620: Unknown result type (might be due to invalid IL or missing references)
			//IL_062e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0633: Unknown result type (might be due to invalid IL or missing references)
			//IL_0641: Unknown result type (might be due to invalid IL or missing references)
			//IL_0343: Unknown result type (might be due to invalid IL or missing references)
			//IL_0348: Unknown result type (might be due to invalid IL or missing references)
			//IL_034c: 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_0369: Unknown result type (might be due to invalid IL or missing references)
			//IL_0376: Unknown result type (might be due to invalid IL or missing references)
			//IL_032c: 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_033c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0757: Unknown result type (might be due to invalid IL or missing references)
			//IL_0762: Unknown result type (might be due to invalid IL or missing references)
			//IL_0792: Unknown result type (might be due to invalid IL or missing references)
			//IL_07ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_07b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_07b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_07bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_039b: Unknown result type (might be due to invalid IL or missing references)
			//IL_039d: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0926: Unknown result type (might be due to invalid IL or missing references)
			//IL_092b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0937: Unknown result type (might be due to invalid IL or missing references)
			//IL_093c: Unknown result type (might be due to invalid IL or missing references)
			//IL_083c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0866: Unknown result type (might be due to invalid IL or missing references)
			//IL_08a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_08c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_08e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0900: Unknown result type (might be due to invalid IL or missing references)
			Vector3 center = (((Object)(object)leashCenter != (Object)null) ? leashCenter.position : ((Component)this).transform.position);
			Vector3 pos;
			if ((Object)(object)_agent == (Object)null)
			{
				pos = ((Component)this).transform.position;
				if (IsNavMeshReadyNear(in pos, 3f))
				{
					NavMeshHit val = default(NavMeshHit);
					if (NavMesh.SamplePosition(((Component)this).transform.position, ref val, 3f, -1))
					{
						((Component)this).transform.position = ((NavMeshHit)(ref val)).position;
					}
					_agent = ((Component)this).gameObject.AddComponent<NavMeshAgent>();
					_agent.speed = roamSpeed;
					_agent.angularSpeed = turnSpeed;
					_agent.acceleration = 12f;
					_agent.stoppingDistance = 0.15f;
					_agent.autoBraking = false;
					_agent.autoRepath = true;
					_agent.updateRotation = false;
					_agent.updatePosition = false;
					_agent.obstacleAvoidanceType = (ObstacleAvoidanceType)4;
					_agent.radius = Mathf.Max(0.3f, _cc.radius * 0.9f);
					_agent.height = Mathf.Max(1.5f, _cc.height * 0.95f);
					_agent.baseOffset = 0f;
					_agent.avoidancePriority = Random.Range(30, 70);
					NavMeshHit val2 = default(NavMeshHit);
					if (NavMesh.SamplePosition(((Component)this).transform.position, ref val2, 3f, _agent.areaMask))
					{
						_agent.Warp(((NavMeshHit)(ref val2)).position);
						((Component)this).transform.position = ((NavMeshHit)(ref val2)).position;
					}
					_agent.nextPosition = ((Component)this).transform.position;
				}
			}
			if (Time.time < _idleUntil)
			{
				DriveAnimator(0f, 0f);
				ApplyMove(Vector3.zero);
				ProximityTouchKill();
				SyncAgentToController();
				return;
			}
			RefreshChaseTarget();
			Vector3 horizontalVelocity = Vector3.zero;
			if ((Object)(object)_chaseTarget != (Object)null)
			{
				if ((Object)(object)_agent != (Object)null && _agent.isOnNavMesh)
				{
					_agent.speed = chaseSpeed;
					if (Time.time >= _nextRepathAt)
					{
						_nextRepathAt = Time.time + repathInterval;
						if (TryGetChaseDestination(_chaseTarget.position, out var dest))
						{
							_agent.SetDestination(dest);
						}
					}
					if (!_agent.pathPending)
					{
						Vector3 desiredVelocity = _agent.desiredVelocity;
						if (((Vector3)(ref desiredVelocity)).sqrMagnitude > 0.0001f)
						{
							horizontalVelocity = ((Vector3)(ref desiredVelocity)).normalized * chaseSpeed;
						}
						Vector3 steeringTarget = _agent.steeringTarget;
						Vector3 val3 = default(Vector3);
						((Vector3)(ref val3))..ctor(steeringTarget.x - ((Component)this).transform.position.x, 0f, steeringTarget.z - ((Component)this).transform.position.z);
						if (((Vector3)(ref val3)).sqrMagnitude > 1E-05f)
						{
							Quaternion val4 = Quaternion.LookRotation(val3, Vector3.up);
							((Component)this).transform.rotation = Quaternion.RotateTowards(((Component)this).transform.rotation, val4, turnSpeed * Time.deltaTime);
						}
					}
				}
				else
				{
					Vector3 val5 = _chaseTarget.position - ((Component)this).transform.position;
					Vector3 val6 = default(Vector3);
					((Vector3)(ref val6))..ctor(val5.x, 0f, val5.z);
					float magnitude = ((Vector3)(ref val6)).magnitude;
					if (magnitude > 0.1f)
					{
						Vector3 val7 = val6 / Mathf.Max(magnitude, 0.0001f);
						horizontalVelocity = val7 * chaseSpeed;
						Quaternion val8 = Quaternion.LookRotation(val7, Vector3.up);
						((Component)this).transform.rotation = Quaternion.RotateTowards(((Component)this).transform.rotation, val8, turnSpeed * Time.deltaTime);
					}
				}
				pos = _chaseTarget.position - ((Component)this).transform.position;
				float sqrMagnitude = ((Vector3)(ref pos)).sqrMagnitude;
				if (sqrMagnitude > giveUpRadius * giveUpRadius)
				{
					_chaseTarget = null;
					PickIdle();
				}
			}
			else
			{
				if (!_hasTarget)
				{
					_currentTarget = PickRoamPoint(center, leashRadius, waypointMin, waypointMax);
					_hasTarget = true;
					if ((Object)(object)_agent != (Object)null && _agent.isOnNavMesh)
					{
						_agent.speed = roamSpeed;
						_agent.SetDestination(_currentTarget);
					}
				}
				if ((Object)(object)_agent != (Object)null && _agent.isOnNavMesh)
				{
					Vector3 desiredVelocity2 = _agent.desiredVelocity;
					if (((Vector3)(ref desiredVelocity2)).sqrMagnitude > 0.0001f)
					{
						horizontalVelocity = ((Vector3)(ref desiredVelocity2)).normalized * roamSpeed;
					}
					Vector3 steeringTarget2 = _agent.steeringTarget;
					Vector3 val9 = default(Vector3);
					((Vector3)(ref val9))..ctor(steeringTarget2.x - ((Component)this).transform.position.x, 0f, steeringTarget2.z - ((Component)this).transform.position.z);
					if (((Vector3)(ref val9)).sqrMagnitude > 1E-05f)
					{
						Quaternion val10 = Quaternion.LookRotation(val9, Vector3.up);
						((Component)this).transform.rotation = Quaternion.RotateTowards(((Component)this).transform.rotation, val10, turnSpeed * Time.deltaTime);
					}
					if (!_agent.pathPending && _agent.remainingDistance <= _agent.stoppingDistance + 0.05f)
					{
						_hasTarget = false;
						PickIdle();
					}
				}
				else
				{
					Vector3 val11 = _currentTarget - ((Component)this).transform.position;
					Vector3 val12 = default(Vector3);
					((Vector3)(ref val12))..ctor(val11.x, 0f, val11.z);
					float magnitude2 = ((Vector3)(ref val12)).magnitude;
					if (magnitude2 < 0.1f)
					{
						_hasTarget = false;
						PickIdle();
					}
					else
					{
						Vector3 val13 = val12 / Mathf.Max(magnitude2, 0.0001f);
						horizontalVelocity = val13 * roamSpeed;
						Quaternion val14 = Quaternion.LookRotation(val13, Vector3.up);
						((Component)this).transform.rotation = Quaternion.RotateTowards(((Component)this).transform.rotation, val14, turnSpeed * Time.deltaTime);
					}
				}
			}
			float angularSpeedPerSec = Mathf.Abs(AngularSpeed(_lastRot, ((Component)this).transform.rotation)) / Mathf.Max(Time.deltaTime, 1E-05f);
			DriveAnimator(((Vector3)(ref horizontalVelocity)).magnitude, angularSpeedPerSec);
			ApplyMove(horizontalVelocity);
			HandleOffMeshLink();
			ProximityTouchKill();
			pos = ((Component)this).transform.position - _lastWorldPos;
			float magnitude3 = ((Vector3)(ref pos)).magnitude;
			if (((Vector3)(ref horizontalVelocity)).sqrMagnitude > 0.01f && magnitude3 < 0.01f)
			{
				_stuckTimer += Time.deltaTime;
			}
			else
			{
				_stuckTimer = 0f;
			}
			if ((Object)(object)_agent != (Object)null)
			{
				if (!_agent.isOnNavMesh)
				{
					NavMeshHit val15 = default(NavMeshHit);
					if (NavMesh.SamplePosition(((Component)this).transform.position, ref val15, 2.5f, _agent.areaMask))
					{
						_agent.Warp(((NavMeshHit)(ref val15)).position);
					}
				}
				else if (_stuckTimer > 0.75f && !_agent.pathPending)
				{
					_agent.Warp(((Component)this).transform.position);
					if ((Object)(object)_chaseTarget != (Object)null && TryGetChaseDestination(_chaseTarget.position, out var dest2))
					{
						_agent.SetDestination(dest2);
					}
					else if (_hasTarget)
					{
						_agent.SetDestination(_currentTarget);
					}
					_stuckTimer = 0f;
				}
			}
			SyncAgentToController();
			_lastRot = ((Component)this).transform.rotation;
			_lastWorldPos = ((Component)this).transform.position;
		}

		private void RefreshChaseTarget()
		{
			//IL_0081: 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_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_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: 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_00ba: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)CloneManager.Instance == (Object)null)
			{
				_chaseTarget = null;
				return;
			}
			Vector3 val;
			if ((Object)(object)_chaseTarget != (Object)null)
			{
				val = _chaseTarget.position - ((Component)this).transform.position;
				float sqrMagnitude = ((Vector3)(ref val)).sqrMagnitude;
				if (sqrMagnitude <= giveUpRadius * giveUpRadius)
				{
					return;
				}
				_chaseTarget = null;
			}
			PlayerAvatar val2 = CloneManager.Instance.FindNearest(((Component)this).transform.position, Settings.IncludeLocalForTesting);
			if ((Object)(object)val2 != (Object)null)
			{
				val = ((Component)val2).transform.position - ((Component)this).transform.position;
				float sqrMagnitude2 = ((Vector3)(ref val)).sqrMagnitude;
				if (sqrMagnitude2 <= chaseRadius * chaseRadius)
				{
					_chaseTarget = ((Component)val2).transform;
				}
			}
		}

		private void SyncAgentToController()
		{
			//IL_001f: 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_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_004a: 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)
			if (!((Object)(object)_agent == (Object)null))
			{
				_agent.nextPosition = ((Component)this).transform.position;
				Vector3 val = ((Component)_agent).transform.position - ((Component)this).transform.position;
				if (((Vector3)(ref val)).sqrMagnitude > 0.25f)
				{
					_agent.Warp(((Component)this).transform.position);
				}
			}
		}

		private void ApplyMove(Vector3 horizontalVelocity)
		{
			//IL_006e: 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_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_0091: 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_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_009f: 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_00c5: 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)
			float deltaTime = Time.deltaTime;
			if (!(deltaTime <= 0f))
			{
				_grounded = _cc.isGrounded;
				if (_grounded && _verticalVel < 0f)
				{
					_verticalVel = 0f - groundStick;
				}
				else
				{
					_verticalVel -= gravity * deltaTime;
				}
				Vector3 val = horizontalVelocity * deltaTime + new Vector3(0f, _verticalVel * deltaTime, 0f);
				CollisionFlags val2 = _cc.Move(val);
				if ((val2 & 2) != 0 && _verticalVel > 0f)
				{
					_verticalVel = 0f;
				}
				if ((val2 & 4) != 0 && _verticalVel < 0f - groundStick)
				{
					_verticalVel = 0f - groundStick;
				}
			}
		}

		private void PickIdle()
		{
			_idleUntil = Time.time + Random.Range(idleTimeMin, idleTimeMax);
		}

		private Vector3 PickRoamPoint(Vector3 center, float radius, float minStep, float maxStep)
		{
			//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_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_003f: 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_0070: 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_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_0075: Unknown result type (might be due to invalid IL or missing references)
			float num = Random.Range(minStep, maxStep);
			float num2 = Random.Range(0f, MathF.PI * 2f);
			Vector3 val = default(Vector3);
			((Vector3)(ref val))..ctor(Mathf.Cos(num2), 0f, Mathf.Sin(num2));
			Vector3 pos = center + val * num;
			NavMeshHit val2 = default(NavMeshHit);
			if (IsNavMeshReadyNear(in pos, 5f) && NavMesh.SamplePosition(pos, ref val2, 5f, -1))
			{
				return ((NavMeshHit)(ref val2)).position;
			}
			return pos;
		}

		private void DriveAnimator(float linearSpeed, float angularSpeedPerSec)
		{
			if (!((Object)(object)_anim == (Object)null))
			{
				bool flag = linearSpeed > 0.05f;
				bool flag2 = angularSpeedPerSec > 15f;
				_anim.SetBool(ID_Moving, flag);
				_anim.SetBool(ID_Turning, flag2);
				_anim.SetBool(ID_Sprinting, false);
				_anim.SetBool(ID_Crouching, false);
				_anim.SetBool(ID_Crawling, false);
				_anim.SetBool(ID_Sliding, false);
				_anim.SetBool(ID_Tumbling, false);
			}
		}

		private static float AngularSpeed(Quaternion a, Quaternion b)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_000d: Unknown result type (might be due to invalid IL or missing references)
			Quaternion val = b * Quaternion.Inverse(a);
			Vector3 val2 = default(Vector3);
			float num = default(float);
			((Quaternion)(ref val)).ToAngleAxis(ref num, ref val2);
			num = Mathf.Repeat(num + 180f, 360f) - 180f;
			return Mathf.Abs(num);
		}

		public static bool IsNavMeshReadyNear(in Vector3 pos, float maxDistance)
		{
			//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_0007: 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_0025: Unknown result type (might be due to invalid IL or missing references)
			NavMeshTriangulation val = NavMesh.CalculateTriangulation();
			if (val.vertices == null || val.vertices.Length == 0)
			{
				return false;
			}
			NavMeshHit val2 = default(NavMeshHit);
			return NavMesh.SamplePosition(pos, ref val2, maxDistance, -1);
		}

		public static void AutoSizeCharacterController(CharacterController cc, GameObject root)
		{
			//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_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: 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_0105: 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_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)
			Renderer[] componentsInChildren = root.GetComponentsInChildren<Renderer>(true);
			Bounds bounds = default(Bounds);
			((Bounds)(ref bounds))..ctor(root.transform.position, Vector3.one * 0.5f);
			bool flag = false;
			Renderer[] array = componentsInChildren;
			foreach (Renderer val in array)
			{
				if (val.enabled && (val is SkinnedMeshRenderer || val is MeshRenderer))
				{
					if (!flag)
					{
						bounds = val.bounds;
						flag = true;
					}
					else
					{
						((Bounds)(ref bounds)).Encapsulate(val.bounds);
					}
				}
			}
			float num = Mathf.Clamp(((Bounds)(ref bounds)).size.y, 1.4f, 2.4f);
			float radius = Mathf.Clamp(Mathf.Max(((Bounds)(ref bounds)).extents.x, ((Bounds)(ref bounds)).extents.z) * 0.6f, 0.25f, 0.6f);
			cc.center = new Vector3(0f, num * 0.5f, 0f);
			cc.height = num;
			cc.radius = radius;
		}

		private void TryTouchKill(PlayerAvatar victim)
		{
			if (!((Object)(object)victim == (Object)null) && !(Time.time < _killReadyAt) && !((Object)(object)((Component)victim).GetComponent<PlayerAvatarMenu>() != (Object)null) && Patch_PlayerAvatar_Start.IsLocalPlayer(victim))
			{
				_killReadyAt = Time.time + killCooldown;
				LocalKillUtil.TryKillLocal();
			}
		}

		private void ProximityTouchKill()
		{
			//IL_007d: 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_008d: 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)
			if (Time.time < _killReadyAt || (Object)(object)CloneManager.Instance == (Object)null)
			{
				return;
			}
			foreach (PlayerAvatar item in CloneManager.Instance.LiveAvatars())
			{
				if (!((Object)(object)item == (Object)null) && Patch_PlayerAvatar_Start.IsLocalPlayer(item) && !((Object)(object)((Component)item).GetComponent<PlayerAvatarMenu>() != (Object)null))
				{
					Vector3 val = ((Component)item).transform.position - ((Component)this).transform.position;
					float sqrMagnitude = ((Vector3)(ref val)).sqrMagnitude;
					if (sqrMagnitude <= killTouchRadius * killTouchRadius)
					{
						TryTouchKill(item);
						break;
					}
				}
			}
		}

		private void OnControllerColliderHit(ControllerColliderHit hit)
		{
			if (hit != null && !((Object)(object)hit.collider == (Object)null))
			{
				PlayerAvatar componentInParent = ((Component)hit.collider).GetComponentInParent<PlayerAvatar>();
				if (!((Object)(object)componentInParent == (Object)null))
				{
					TryTouchKill(componentInParent);
				}
			}
		}

		private bool TryGetChaseDestination(Vector3 targetWorldPos, out Vector3 dest)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: 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_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_006f: 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_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			int num = (((Object)(object)_agent != (Object)null) ? _agent.areaMask : (-1));
			NavMeshHit val = default(NavMeshHit);
			if (NavMesh.SamplePosition(targetWorldPos, ref val, 2f, num))
			{
				dest = ((NavMeshHit)(ref val)).position;
				return true;
			}
			for (int i = 0; i < 6; i++)
			{
				float num2 = 3f + 1.5f * (float)i;
				Vector3 val2 = targetWorldPos + Random.insideUnitSphere * num2;
				val2.y = targetWorldPos.y;
				if (NavMesh.SamplePosition(val2, ref val, 1.75f, num))
				{
					dest = ((NavMeshHit)(ref val)).position;
					return true;
				}
			}
			dest = default(Vector3);
			return false;
		}

		private void HandleOffMeshLink()
		{
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_agent == (Object)null) && _agent.isOnNavMesh && _agent.isOnOffMeshLink && !_traversingLink)
			{
				_traversingLink = true;
				OffMeshLinkData currentOffMeshLinkData = _agent.currentOffMeshLinkData;
				((MonoBehaviour)this).StartCoroutine(TraverseLink(((OffMeshLinkData)(ref currentOffMeshLinkData)).endPos));
			}
		}

		[IteratorStateMachine(typeof(<TraverseLink>d__57))]
		private IEnumerator TraverseLink(Vector3 end)
		{
			//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)
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <TraverseLink>d__57(0)
			{
				<>4__this = this,
				end = end
			};
		}

		public static bool TrySnapToNavMesh(Transform t, float maxDist, int areaMask = -1)
		{
			//IL_0002: 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)
			NavMeshHit val = default(NavMeshHit);
			if (NavMesh.SamplePosition(t.position, ref val, maxDist, areaMask))
			{
				t.position = ((NavMeshHit)(ref val)).position;
				return true;
			}
			return false;
		}
	}
	public class CloneManager : MonoBehaviour
	{
		private struct LevelPoint
		{
			public Vector3 pos;

			public Quaternion rot;
		}

		[CompilerGenerated]
		private sealed class <LiveAvatars>d__30 : IEnumerable<PlayerAvatar>, IEnumerable, IEnumerator<PlayerAvatar>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private PlayerAvatar <>2__current;

			private int <>l__initialThreadId;

			public CloneManager <>4__this;

			private int <i>5__1;

			private PlayerAvatar <a>5__2;

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

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

			[DebuggerHidden]
			public <LiveAvatars>d__30(int <>1__state)
			{
				this.<>1__state = <>1__state;
				<>l__initialThreadId = Environment.CurrentManagedThreadId;
			}

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

			private bool MoveNext()
			{
				int num = <>1__state;
				if (num != 0)
				{
					if (num != 1)
					{
						return false;
					}
					<>1__state = -1;
					goto IL_0087;
				}
				<>1__state = -1;
				<>4__this.PruneAvatars();
				<i>5__1 = 0;
				goto IL_009e;
				IL_0087:
				<a>5__2 = null;
				<i>5__1++;
				goto IL_009e;
				IL_009e:
				if (<i>5__1 < <>4__this._avatars.Count)
				{
					if (<>4__this._avatars[<i>5__1].TryGetTarget(out <a>5__2) && (Object)(object)<a>5__2 != (Object)null)
					{
						<>2__current = <a>5__2;
						<>1__state = 1;
						return true;
					}
					goto IL_0087;
				}
				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();
			}

			[DebuggerHidden]
			IEnumerator<PlayerAvatar> IEnumerable<PlayerAvatar>.GetEnumerator()
			{
				<LiveAvatars>d__30 result;
				if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
				{
					<>1__state = 0;
					result = this;
				}
				else
				{
					result = new <LiveAvatars>d__30(0)
					{
						<>4__this = <>4__this
					};
				}
				return result;
			}

			[DebuggerHidden]
			IEnumerator IEnumerable.GetEnumerator()
			{
				return ((IEnumerable<PlayerAvatar>)this).GetEnumerator();
			}
		}

		public static CloneManager Instance;

		private readonly List<WeakReference<PlayerAvatar>> _avatars = new List<WeakReference<PlayerAvatar>>();

		private LocalCloneMarker _activeClone;

		private float _switchAt;

		private float _rescheduleAt;

		private CloneCollisionLocalizer _collisionLocalizer;

		private float _despawnAt = -1f;

		private void Awake()
		{
			if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this)
			{
				Object.Destroy((Object)(object)((Component)this).gameObject);
				return;
			}
			Instance = this;
			Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
			ScheduleNext();
		}

		public void RequestRescheduleSoon()
		{
			_rescheduleAt = Time.time + 0.5f;
		}

		private void Update()
		{
			if (!Patch_PlayerAvatar_Start.SceneLooksLikeGameplay())
			{
				DestroyActive();
				return;
			}
			if (_rescheduleAt > 0f && Time.time >= _rescheduleAt)
			{
				_rescheduleAt = 0f;
				ScheduleNext();
			}
			PruneAvatars();
			if (!GameplayReady())
			{
				return;
			}
			if ((Object)(object)_activeClone != (Object)null)
			{
				if (_despawnAt > 0f && Time.time >= _despawnAt)
				{
					DestroyActive();
					ScheduleNext();
				}
			}
			else if (Time.time >= _switchAt)
			{
				TrySpawnNearCandidate();
			}
		}

		private static bool GameplayReady()
		{
			if (SemiFunc.IsMainMenu())
			{
				return false;
			}
			if (LobbyLogGate.IsBlocking)
			{
				return false;
			}
			LevelGenerator instance = LevelGenerator.Instance;
			if ((Object)(object)instance == (Object)null || !instance.Generated)
			{
				return false;
			}
			if (SceneGuard.GeneratedTrueAt < 0f)
			{
				return false;
			}
			if (Time.time - SceneGuard.GeneratedTrueAt < CloneTiming.PostGenDelay)
			{
				return false;
			}
			return true;
		}

		public static void Ensure()
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Expected O, but got Unknown
			if (!((Object)(object)Instance != (Object)null))
			{
				GameObject val = new GameObject("[DuplicatePlayers] CloneManager");
				Object.DontDestroyOnLoad((Object)(object)val);
				val.AddComponent<CloneManager>();
			}
		}

		public static void Register(PlayerAvatar a)
		{
			Ensure();
			SceneGuard.EnsureHooked();
			Instance._avatars.Add(new WeakReference<PlayerAvatar>(a));
			Instance.RefreshCloneCollisionFilters();
		}

		public static void Unregister(PlayerAvatar a)
		{
			if (!((Object)(object)Instance == (Object)null))
			{
				Instance.PruneAvatars();
				Instance.RefreshCloneCollisionFilters();
			}
		}

		private void PruneAvatars()
		{
			for (int num = _avatars.Count - 1; num >= 0; num--)
			{
				if (!_avatars[num].TryGetTarget(out PlayerAvatar target) || (Object)(object)target == (Object)null)
				{
					_avatars.RemoveAt(num);
				}
			}
		}

		private void TrySpawnNearCandidate()
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			if (Settings.PreferLevelSpawnPoints && TryPickLevelPointSpawn(out Vector3 pos, out Quaternion rot, out PlayerAvatar leashAvatar))
			{
				_activeClone = SpawnCloneFor(leashAvatar, pos, rot);
				if ((Object)(object)_activeClone != (Object)null)
				{
					_despawnAt = Time.time + Random.Range(CloneTiming.MinSeconds, CloneTiming.MaxSeconds);
					return;
				}
			}
			List<PlayerAvatar> candidates = GetCandidates();
			if (candidates.Count == 0)
			{
				ScheduleNext();
				return;
			}
			candidates.Sort(delegate(PlayerAvatar a, PlayerAvatar b)
			{
				//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_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)
				int num;
				if ((Object)(object)a != (Object)null)
				{
					Vector3 pos3 = ((Component)a).transform.position;
					num = (IndependentCloneBrain.IsNavMeshReadyNear(in pos3, 6f) ? 1 : 0);
				}
				else
				{
					num = 0;
				}
				bool flag = (byte)num != 0;
				int num2;
				if ((Object)(object)b != (Object)null)
				{
					Vector3 pos3 = ((Component)b).transform.position;
					num2 = (IndependentCloneBrain.IsNavMeshReadyNear(in pos3, 6f) ? 1 : 0);
				}
				else
				{
					num2 = 0;
				}
				bool flag2 = (byte)num2 != 0;
				return (flag != flag2) ? ((!flag) ? 1 : (-1)) : 0;
			});
			PlayerAvatar val = candidates[Random.Range(0, candidates.Count)];
			if (!TryFindValidSpawnPose(val, out var pos2, out var rot2))
			{
				_switchAt = Time.time + 2f;
				return;
			}
			_activeClone = SpawnCloneFor(val, pos2, rot2);
			if ((Object)(object)_activeClone != (Object)null)
			{
				_despawnAt = Time.time + Random.Range(CloneTiming.MinSeconds, CloneTiming.MaxSeconds);
			}
			else
			{
				_switchAt = Time.time + 2f;
			}
		}

		private void ScheduleNext()
		{
			_switchAt = Time.time + Random.Range(CloneTiming.MinSeconds, CloneTiming.MaxSeconds);
		}

		private List<PlayerAvatar> GetCandidates()
		{
			PruneAvatars();
			List<PlayerAvatar> list = new List<PlayerAvatar>();
			foreach (WeakReference<PlayerAvatar> avatar in _avatars)
			{
				if (avatar.TryGetTarget(out var target) && !((Object)(object)target == (Object)null) && !((Object)(object)((Component)target).GetComponent<PlayerAvatarMenu>() != (Object)null))
				{
					bool flag = Patch_PlayerAvatar_Start.IsLocalPlayer(target);
					if (!(!Settings.IncludeLocalForTesting && flag) && LooksAliveAndRenderable(target))
					{
						list.Add(target);
					}
				}
			}
			return list;
		}

		private void DestroyActive()
		{
			if ((Object)(object)_activeClone != (Object)null)
			{
				Object.Destroy((Object)(object)((Component)_activeClone).gameObject);
			}
			_activeClone = null;
			_collisionLocalizer = null;
			_despawnAt = -1f;
		}

		private LocalCloneMarker SpawnCloneFor(PlayerAvatar leashAvatar, Vector3 spawnPos, Quaternion spawnRot)
		{
			//IL_009a: 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_028b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0290: Unknown result type (might be due to invalid IL or missing references)
			//IL_03aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b1: Expected O, but got Unknown
			//IL_03cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_03de: Unknown result type (might be due to invalid IL or missing references)
			//IL_0422: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if ((Object)(object)leashAvatar == (Object)null)
				{
					return null;
				}
				PlayerAvatarVisuals val = leashAvatar.playerAvatarVisuals ?? ((Component)leashAvatar).GetComponentInChildren<PlayerAvatarVisuals>(true);
				if ((Object)(object)val == (Object)null)
				{
					return null;
				}
				GameObject gameObject = ((Component)val).gameObject;
				GameObject val2 = Object.Instantiate<GameObject>(gameObject);
				((Object)val2).name = ((Object)gameObject).name + " (Omniscye Clone — FreeRoam)";
				int num = ((Component)leashAvatar).gameObject.layer;
				if (num < 0)
				{
					num = LayerMask.NameToLayer("Default");
				}
				val2.layer = num;
				LocalCloneMarker result = val2.AddComponent<LocalCloneMarker>();
				val2.transform.SetPositionAndRotation(spawnPos, spawnRot);
				Patch_PlayerAvatar_Start.DecoupleFromOriginal(val2, leashAvatar);
				PlayerAvatarVisuals[] componentsInChildren = val2.GetComponentsInChildren<PlayerAvatarVisuals>(true);
				for (int i = 0; i < componentsInChildren.Length; i++)
				{
					try
					{
						((Behaviour)componentsInChildren[i]).enabled = false;
						componentsInChildren[i].playerAvatar = null;
						componentsInChildren[i].isMenuAvatar = true;
					}
					catch
					{
					}
					try
					{
						Object.Destroy((Object)(object)componentsInChildren[i]);
					}
					catch
					{
					}
				}
				Animator[] componentsInChildren2 = val2.GetComponentsInChildren<Animator>(true);
				foreach (Animator val3 in componentsInChildren2)
				{
					if (!((Object)(object)val3 == (Object)null))
					{
						((Behaviour)val3).enabled = true;
						val3.keepAnimatorStateOnDisable = true;
						val3.applyRootMotion = false;
						val3.updateMode = (AnimatorUpdateMode)0;
						val3.cullingMode = (AnimatorCullingMode)0;
						if (val3.speed <= 0f)
						{
							val3.speed = 0.98f + Random.Range(-0.03f, 0.03f);
						}
						if ((Object)(object)((Component)val3).gameObject.GetComponent<CloneAnimationEventSink>() == (Object)null)
						{
							((Component)val3).gameObject.AddComponent<CloneAnimationEventSink>();
						}
					}
				}
				EnsureCloneRenderersReallyVisible(val2);
				CharacterController val4 = val2.GetComponent<CharacterController>() ?? val2.AddComponent<CharacterController>();
				IndependentCloneBrain.AutoSizeCharacterController(val4, val2);
				val4.slopeLimit = 50f;
				val4.stepOffset = 0.25f;
				val4.skinWidth = 0.02f;
				val4.detectCollisions = true;
				_collisionLocalizer = val2.GetComponent<CloneCollisionLocalizer>() ?? val2.AddComponent<CloneCollisionLocalizer>();
				((Component)_collisionLocalizer).SendMessage("RefreshIgnores", (object)true, (SendMessageOptions)1);
				SnapToGround(val2);
				if (!IndependentCloneBrain.TrySnapToNavMesh(val2.transform, 4f))
				{
					Object.Destroy((Object)(object)val2);
					return null;
				}
				val4.Move(Vector3.zero);
				IndependentCloneBrain independentCloneBrain = val2.AddComponent<IndependentCloneBrain>();
				independentCloneBrain.leashCenter = ((Component)leashAvatar).transform;
				independentCloneBrain.leashRadius = 22f;
				independentCloneBrain.chaseRadius = 25f;
				independentCloneBrain.giveUpRadius = 35f;
				independentCloneBrain.chaseSpeed = 1f;
				independentCloneBrain.repathInterval = 0.33f;
				Collider[] componentsInChildren3 = val2.GetComponentsInChildren<Collider>(true);
				foreach (Collider val5 in componentsInChildren3)
				{
					if (!(val5 is CharacterController))
					{
						val5.enabled = false;
					}
				}
				Rigidbody[] componentsInChildren4 = val2.GetComponentsInChildren<Rigidbody>(true);
				foreach (Rigidbody val6 in componentsInChildren4)
				{
					Object.Destroy((Object)(object)val6);
				}
				PlayerAvatar[] componentsInChildren5 = val2.GetComponentsInChildren<PlayerAvatar>(true);
				foreach (PlayerAvatar val7 in componentsInChildren5)
				{
					if ((Object)(object)val7 != (Object)(object)leashAvatar)
					{
						Object.Destroy((Object)(object)val7);
					}
				}
				FixAndAttachNameToHead(val2, "Omniscye");
				Debug.Log((object)"[DuplicatePlayers] Spawned Omniscye clone.");
				GameObject val8 = new GameObject("DoorBumper");
				val8.transform.SetParent(val2.transform, false);
				val8.transform.localPosition = Vector3.zero;
				val8.transform.localRotation = Quaternion.identity;
				val8.layer = val2.layer;
				CapsuleCollider val9 = val8.AddComponent<CapsuleCollider>();
				val9.height = val4.height;
				val9.radius = val4.radius;
				val9.center = val4.center;
				((Collider)val9).isTrigger = false;
				Rigidbody val10 = val8.AddComponent<Rigidbody>();
				val10.isKinematic = true;
				val10.interpolation = (RigidbodyInterpolation)1;
				val10.collisionDetectionMode = (CollisionDetectionMode)3;
				val10.constraints = (RigidbodyConstraints)112;
				DoorBumperFollower doorBumperFollower = val8.AddComponent<DoorBumperFollower>();
				doorBumperFollower.target = val2.transform;
				return result;
			}
			catch (Exception arg)
			{
				Debug.LogWarning((object)$"[DuplicatePlayers] SpawnCloneFor failed: {arg}");
				return null;
			}
		}

		private void RefreshCloneCollisionFilters()
		{
			if ((Object)(object)_collisionLocalizer != (Object)null)
			{
				((Component)_collisionLocalizer).SendMessage("RefreshIgnores", (object)true, (SendMessageOptions)1);
			}
		}

		private static void SnapToGround(GameObject go)
		{
			//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_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_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_00a3: 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_00cd: 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_008a: 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_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_010a: Unknown result type (might be due to invalid IL or missing references)
			CharacterController component = go.GetComponent<CharacterController>();
			Vector3 val = go.transform.position + Vector3.up * 1.5f;
			RaycastHit val2 = default(RaycastHit);
			NavMeshHit val3 = default(NavMeshHit);
			if (Physics.Raycast(val, Vector3.down, ref val2, 11.5f, -1, (QueryTriggerInteraction)1))
			{
				float num = (((Object)(object)component != (Object)null) ? (component.center.y - component.height * 0.5f) : 0f);
				go.transform.position = ((RaycastHit)(ref val2)).point - new Vector3(0f, num - 0.02f, 0f);
			}
			else if (NavMesh.SamplePosition(go.transform.position, ref val3, 6f, -1))
			{
				float num2 = (((Object)(object)component != (Object)null) ? (component.center.y - component.height * 0.5f) : 0f);
				go.transform.position = ((NavMeshHit)(ref val3)).position - new Vector3(0f, num2 - 0.02f, 0f);
			}
		}

		private static void FixAndAttachNameToHead(GameObject root, string label)
		{
			//IL_0184: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Expected O, but got Unknown
			//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_01d4: 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)
			Component[] componentsInChildren = root.GetComponentsInChildren<Component>(true);
			foreach (Component val in componentsInChildren)
			{
				if ((Object)(object)val == (Object)null)
				{
					continue;
				}
				string name = ((object)val).GetType().Name;
				if (name.IndexOf("Name", StringComparison.OrdinalIgnoreCase) < 0 && name.IndexOf("Nameplate", StringComparison.OrdinalIgnoreCase) < 0 && name.IndexOf("WorldSpaceUIPlayerName", StringComparison.OrdinalIgnoreCase) < 0)
				{
					continue;
				}
				Behaviour val2 = (Behaviour)(object)((val is Behaviour) ? val : null);
				if (val2 != null)
				{
					val2.enabled = false;
				}
				if (!(val is Transform))
				{
					try
					{
						Object.Destroy((Object)(object)val);
					}
					catch
					{
					}
				}
			}
			Transform val3 = null;
			Animator componentInChildren = root.GetComponentInChildren<Animator>();
			if ((Object)(object)componentInChildren != (Object)null && componentInChildren.isHuman)
			{
				try
				{
					val3 = componentInChildren.GetBoneTransform((HumanBodyBones)10);
				}
				catch
				{
				}
			}
			if ((Object)(object)val3 == (Object)null)
			{
				val3 = ((IEnumerable<Transform>)root.GetComponentsInChildren<Transform>(true)).FirstOrDefault((Func<Transform, bool>)((Transform t) => (Object)(object)t != (Object)null && ((Object)t).name.ToLowerInvariant().Contains("head")));
			}
			if ((Object)(object)val3 == (Object)null)
			{
				val3 = root.transform;
			}
			Transform val4 = root.transform.Find("Omniscye_Label");
			if ((Object)(object)val4 != (Object)null)
			{
				Object.Destroy((Object)(object)((Component)val4).gameObject);
			}
			GameObject val5 = new GameObject("Omniscye_Label");
			val5.transform.SetParent(val3, false);
			val5.transform.localPosition = new Vector3(0f, 0.78f, 0f);
			val5.transform.localRotation = Quaternion.identity;
			val5.transform.localScale = Vector3.one;
			val5.AddComponent<SimpleBillboard>();
			TextMesh val6 = val5.AddComponent<TextMesh>();
			val6.text = label;
			val6.anchor = (TextAnchor)7;
			val6.characterSize = 0.04f;
			val6.fontSize = 48;
			val6.richText = false;
			val6.color = Color.red;
		}

		private bool TryPickLevelPointSpawn(out Vector3 pos, out Quaternion rot, out PlayerAvatar leashAvatar)
		{
			//IL_0005: 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_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_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_0064: 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_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_00a8: 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_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: 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_0143: 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_0197: Unknown result type (might be due to invalid IL or missing references)
			//IL_019c: Unknown result type (might be due to invalid IL or missing references)
			leashAvatar = null;
			pos = default(Vector3);
			rot = Quaternion.identity;
			List<Transform> list = FindAllLikelyLevelPoints();
			if (list.Count == 0)
			{
				return false;
			}
			List<LevelPoint> list2 = new List<LevelPoint>(list.Count);
			NavMeshHit val = default(NavMeshHit);
			for (int i = 0; i < list.Count; i++)
			{
				Vector3 position = list[i].position;
				Quaternion rotation = list[i].rotation;
				if (NavMesh.SamplePosition(position, ref val, 3f, -1) && HasGroundSupport(((NavMeshHit)(ref val)).position, 4f))
				{
					list2.Add(new LevelPoint
					{
						pos = ((NavMeshHit)(ref val)).position,
						rot = rotation
					});
				}
			}
			if (list2.Count == 0)
			{
				return false;
			}
			List<PlayerAvatar> candidates = GetCandidates();
			LevelPoint levelPoint = list2[Random.Range(0, list2.Count)];
			float num = float.PositiveInfinity;
			PlayerAvatar val2 = null;
			for (int j = 0; j < candidates.Count; j++)
			{
				PlayerAvatar val3 = candidates[j];
				if (!((Object)(object)val3 == (Object)null))
				{
					Vector3 val4 = ((Component)val3).transform.position - levelPoint.pos;
					float sqrMagnitude = ((Vector3)(ref val4)).sqrMagnitude;
					if (sqrMagnitude < num)
					{
						num = sqrMagnitude;
						val2 = val3;
					}
				}
			}
			leashAvatar = val2 ?? candidates.FirstOrDefault();
			pos = levelPoint.pos;
			rot = levelPoint.rot;
			return (Object)(object)leashAvatar != (Object)null;
		}

		private List<Transform> FindAllLikelyLevelPoints()
		{
			List<Transform> list = new List<Transform>(64);
			MonoBehaviour[] array = Object.FindObjectsOfType<MonoBehaviour>(true);
			foreach (MonoBehaviour val in array)
			{
				if ((Object)(object)val == (Object)null)
				{
					continue;
				}
				string text = ((object)val).GetType().Name.ToLowerInvariant();
				if (text.Contains("levelpoint") || text.Contains("levelspawn") || text.Contains("enemyspawn") || text.Contains("spawnpoint") || text.Contains("aispawn") || text.Contains("respawnpoint") || text.Contains("wavespawn") || text.Contains("spawner"))
				{
					Transform transform = ((Component)val).transform;
					if ((Object)(object)transform != (Object)null && ((Component)transform).gameObject.activeInHierarchy)
					{
						list.Add(transform);
					}
				}
			}
			Transform[] array2 = Object.FindObjectsOfType<Transform>(true);
			foreach (Transform val2 in array2)
			{
				if (!((Object)(object)val2 == (Object)null))
				{
					string text2 = ((Object)val2).name.ToLowerInvariant();
					if ((text2.Contains("levelpoint") || text2.Contains("levelspawn") || text2.Contains("enemyspawn") || text2.Contains("spawnpoint") || text2.Contains("aispawn") || text2.Contains("respawn") || text2.Contains("wavespawn") || text2.Contains("spawner")) && ((Component)val2).gameObject.activeInHierarchy)
					{
						list.Add(val2);
					}
				}
			}
			return list.Distinct().ToList();
		}

		private static bool LooksAliveAndRenderable(PlayerAvatar a)
		{
			if ((Object)(object)a == (Object)null || !((Component)a).gameObject.activeInHierarchy)
			{
				return false;
			}
			try
			{
				Type type = ((object)a).GetType();
				FieldInfo field = type.GetField("isDead", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				if (field != null && field.FieldType == typeof(bool) && (bool)field.GetValue(a))
				{
					return false;
				}
				PropertyInfo property = type.GetProperty("IsDead", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				if (property != null && property.PropertyType == typeof(bool) && (bool)property.GetValue(a))
				{
					return false;
				}
			}
			catch
			{
			}
			PlayerAvatarVisuals val = a.playerAvatarVisuals ?? ((Component)a).GetComponentInChildren<PlayerAvatarVisuals>(true);
			if ((Object)(object)val == (Object)null)
			{
				return false;
			}
			Renderer[] componentsInChildren = ((Component)val).GetComponentsInChildren<Renderer>(true);
			foreach (Renderer val2 in componentsInChildren)
			{
				if ((Object)(object)val2 != (Object)null && val2.enabled)
				{
					return true;
				}
			}
			return false;
		}

		private static void EnsureCloneRenderersReallyVisible(GameObject root)
		{
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			Transform[] componentsInChildren = root.GetComponentsInChildren<Transform>(true);
			foreach (Transform val in componentsInChildren)
			{
				if (!((Object)(object)val == (Object)null) && !((Component)val).gameObject.activeSelf)
				{
					((Component)val).gameObject.SetActive(true);
				}
			}
			Renderer[] componentsInChildren2 = root.GetComponentsInChildren<Renderer>(true);
			foreach (Renderer val2 in componentsInChildren2)
			{
				if ((Object)(object)val2 == (Object)null)
				{
					continue;
				}
				val2.enabled = true;
				val2.forceRenderingOff = false;
				try
				{
					Material[] array = ((val2 is SkinnedMeshRenderer || val2 is MeshRenderer) ? val2.materials : null);
					if (array != null)
					{
						foreach (Material val3 in array)
						{
							if (!((Object)(object)val3 == (Object)null) && val3.HasProperty("_Color"))
							{
								Color color = val3.color;
								if (color.a < 0.98f)
								{
									color.a = 1f;
									val3.color = color;
								}
							}
						}
					}
				}
				catch
				{
				}
				SkinnedMeshRenderer val4 = (SkinnedMeshRenderer)(object)((val2 is SkinnedMeshRenderer) ? val2 : null);
				if (val4 != null)
				{
					val4.updateWhenOffscreen = true;
				}
			}
		}

		private static bool TryFindValidSpawnPose(PlayerAvatar host, out Vector3 pos, out Quaternion rot)
		{
			//IL_0002: 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_0012: 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_0069: 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_0075: 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_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: 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_00a8: 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_00af: 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_00c5: 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_010a: 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_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_0119: 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_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_012a: Unknown result type (might be due to invalid IL or missing references)
			//IL_012f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0134: 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_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_0155: Unknown result type (might be due to invalid IL or missing references)
			//IL_0169: Unknown result type (might be due to invalid IL or missing references)
			//IL_016b: Unknown result type (might be due to invalid IL or missing references)
			pos = default(Vector3);
			rot = (((Object)(object)host != (Object)null) ? ((Component)host).transform.rotation : Quaternion.identity);
			if ((Object)(object)host == (Object)null)
			{
				return false;
			}
			Transform transform = ((Component)host).transform;
			float num = 9f;
			float num2 = 2.2f * ((Patch_PlayerAvatar_Start.GetStableSeed(host) % 2 == 0) ? 1f : (-1f));
			Vector3 val = transform.position - transform.forward * num + transform.right * num2;
			NavMeshHit val2 = default(NavMeshHit);
			if (NavMesh.SamplePosition(val, ref val2, 3f, -1))
			{
				Vector3 position = ((NavMeshHit)(ref val2)).position;
				if (HasGroundSupport(position, 3.5f))
				{
					pos = position;
					return true;
				}
			}
			for (int i = 0; i < 12; i++)
			{
				float num3 = 3f + 0.75f * (float)i;
				float num4 = 30f * (float)i;
				Vector3 val3 = Quaternion.Euler(0f, num4, 0f) * -transform.forward;
				Vector3 val4 = transform.position + ((Vector3)(ref val3)).normalized * num3;
				if (NavMesh.SamplePosition(val4, ref val2, 2.5f, -1))
				{
					Vector3 position2 = ((NavMeshHit)(ref val2)).position;
					if (HasGroundSupport(position2, 3.5f))
					{
						pos = position2;
						return true;
					}
				}
			}
			return false;
		}

		private static bool HasGroundSupport(Vector3 originOnMesh, float maxDown)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0016: 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)
			Vector3 val = originOnMesh + Vector3.up * 1.5f;
			RaycastHit val2 = default(RaycastHit);
			if (Physics.Raycast(val, Vector3.down, ref val2, 1.5f + maxDown, -1, (QueryTriggerInteraction)1))
			{
				return true;
			}
			return false;
		}

		[IteratorStateMachine(typeof(<LiveAvatars>d__30))]
		internal IEnumerable<PlayerAvatar> LiveAvatars()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <LiveAvatars>d__30(-2)
			{
				<>4__this = this
			};
		}

		internal PlayerAvatar FindNearest(Vector3 pos, bool includeLocal)
		{
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_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)
			PlayerAvatar result = null;
			float num = float.PositiveInfinity;
			foreach (PlayerAvatar item in LiveAvatars())
			{
				if ((Object)(object)((Component)item).GetComponent<PlayerAvatarMenu>() != (Object)null)
				{
					continue;
				}
				bool flag = Patch_PlayerAvatar_Start.IsLocalPlayer(item);
				if (!(!includeLocal && flag))
				{
					Vector3 val = ((Component)item).transform.position - pos;
					float sqrMagnitude = ((Vector3)(ref val)).sqrMagnitude;
					if (sqrMagnitude < num)
					{
						num = sqrMagnitude;
						result = item;
					}
				}
			}
			return result;
		}
	}
	[HarmonyPatch(typeof(PlayerAvatar), "Start")]
	public static class Patch_PlayerAvatar_Start
	{
		private static void Postfix(PlayerAvatar __instance)
		{
			try
			{
				if (!SceneLooksLikeGameplay())
				{
					Debug.Log((object)"[DuplicatePlayers] Skipped: not in gameplay (menu scene).");
					return;
				}
				if ((Object)(object)((Component)__instance).GetComponent<PlayerAvatarMenu>() != (Object)null)
				{
					Debug.Log((object)"[DuplicatePlayers] Skipped menu avatar.");
					return;
				}
				CloneManager.Ensure();
				SceneGuard.EnsureHooked();
				CloneManager.Register(__instance);
			}
			catch (Exception arg)
			{
				Debug.LogWarning((object)$"[DuplicatePlayers] Register failed: {arg}");
			}
		}

		public static bool SceneLooksLikeGameplay()
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			if (Settings.ForceGameplayCheck)
			{
				return true;
			}
			if (SemiFunc.IsMainMenu())
			{
				return false;
			}
			Scene activeScene = SceneManager.GetActiveScene();
			string text = ((Scene)(ref activeScene)).name ?? string.Empty;
			if (text.IndexOf("Lobby", StringComparison.OrdinalIgnoreCase) >= 0)
			{
				return false;
			}
			if (text.IndexOf("Menu", StringComparison.OrdinalIgnoreCase) >= 0)
			{
				return false;
			}
			if (text.IndexOf("Title", StringComparison.OrdinalIgnoreCase) >= 0)
			{
				return false;
			}
			return true;
		}

		public static bool IsLocalPlayer(PlayerAvatar avatar)
		{
			Type type = ((object)avatar).GetType();
			FieldInfo field = type.GetField("isLocal", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			if (field != null && field.FieldType == typeof(bool))
			{
				try
				{
					if ((bool)field.GetValue(avatar))
					{
						return true;
					}
				}
				catch
				{
				}
			}
			PropertyInfo property = type.GetProperty("IsLocal", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			if (property != null && property.PropertyType == typeof(bool))
			{
				try
				{
					if ((bool)property.GetValue(avatar))
					{
						return true;
					}
				}
				catch
				{
				}
			}
			return false;
		}

		public static int GetStableSeed(PlayerAvatar avatar)
		{
			return ((Object)avatar).GetInstanceID();
		}

		public static void SetLayerRecursively(GameObject go, int layer)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			go.layer = layer;
			foreach (Transform item in go.transform)
			{
				Transform val = item;
				SetLayerRecursively(((Component)val).gameObject, layer);
			}
		}

		public static void DecoupleFromOriginal(GameObject cloneGO, PlayerAvatar source)
		{
			try
			{
				MonoBehaviour[] componentsInChildren = cloneGO.GetComponentsInChildren<MonoBehaviour>(true);
				MonoBehaviour[] array = componentsInChildren;
				foreach (MonoBehaviour val in array)
				{
					if ((Object)(object)val == (Object)null)
					{
						continue;
					}
					Type type = ((object)val).GetType();
					if (type == typeof(IndependentCloneBrain) || type == typeof(CloneAnimationEventSink) || type == typeof(CloneCollisionLocalizer))
					{
						continue;
					}
					bool flag = false;
					FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
					for (int j = 0; j < fields.Length; j++)
					{
						if (typeof(PlayerAvatar).IsAssignableFrom(fields[j].FieldType))
						{
							flag = true;
							break;
						}
					}
					if (!flag)
					{
						string name = type.Name;
						if (name.Contains("Follow") || name.Contains("Copy") || name.Contains("Mirror") || name.Contains("Sync") || name.Contains("IK"))
						{
							flag = true;
						}
					}
					if (flag)
					{
						try
						{
							((Behaviour)val).enabled = false;
						}
						catch
						{
						}
					}
				}
				ParentConstraint[] componentsInChildren2 = cloneGO.GetComponentsInChildren<ParentConstraint>(true);
				ParentConstraint[] array2 = componentsInChildren2;
				foreach (ParentConstraint val2 in array2)
				{
					Object.Destroy((Object)(object)val2);
				}
				PositionConstraint[] componentsInChildren3 = cloneGO.GetComponentsInChildren<PositionConstraint>(true);
				PositionConstraint[] array3 = componentsInChildren3;
				foreach (PositionConstraint val3 in array3)
				{
					Object.Destroy((Object)(object)val3);
				}
				RotationConstraint[] componentsInChildren4 = cloneGO.GetComponentsInChildren<RotationConstraint>(true);
				RotationConstraint[] array4 = componentsInChildren4;
				foreach (RotationConstraint val4 in array4)
				{
					Object.Destroy((Object)(object)val4);
				}
				AimConstraint[] componentsInChildren5 = cloneGO.GetComponentsInChildren<AimConstraint>(true);
				AimConstraint[] array5 = componentsInChildren5;
				foreach (AimConstraint val5 in array5)
				{
					Object.Destroy((Object)(object)val5);
				}
			}
			catch (Exception arg)
			{
				Debug.LogWarning((object)$"[DuplicatePlayers] Decouple failed: {arg}");
			}
		}
	}
	public class SimpleBillboard : MonoBehaviour
	{
		private void LateUpdate()
		{
			//IL_0020: 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_0035: Unknown result type (might be due to invalid IL or missing references)
			Camera main = Camera.main;
			if (!((Object)(object)main == (Object)null))
			{
				((Component)this).transform.rotation = Quaternion.LookRotation(((Component)this).transform.position - ((Component)main).transform.position);
			}
		}
	}
	public class DoorBumperFollower : MonoBehaviour
	{
		public Transform target;

		private Rigidbody _rb;

		private void Awake()
		{
			_rb = ((Component)this).GetComponent<Rigidbody>();
		}

		private void FixedUpdate()
		{
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)target) && Object.op_Implicit((Object)(object)_rb))
			{
				_rb.MovePosition(target.position);
				_rb.MoveRotation(target.rotation);
			}
		}
	}
	[HarmonyPatch(typeof(PlayerAvatar), "OnDestroy")]
	public static class Patch_PlayerAvatar_OnDestroy
	{
		private static void Prefix(PlayerAvatar __instance)
		{
			try
			{
				CloneManager.Unregister(__instance);
				LocalCloneMarker[] array = Object.FindObjectsOfType<LocalCloneMarker>(true);
				for (int i = 0; i < array.Length; i++)
				{
					if ((Object)(object)array[i] != (Object)null && (Object)(object)((Component)array[i]).gameObject != (Object)null)
					{
						Object.Destroy((Object)(object)((Component)array[i]).gameObject);
					}
				}
			}
			catch (Exception arg)
			{
				Debug.LogWarning((object)$"[DuplicatePlayers] Cleanup failed: {arg}");
			}
		}
	}
}
namespace Haunted
{
	[BepInPlugin("Omniscye.Haunted", "Haunted", "1.0")]
	public class Haunted : BaseUnityPlugin
	{
		internal static Haunted 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()
		{
		}
	}
}