Decompiled source of SCP3166 v1.0.1

plugins/ProjectSCP.SCP3166.dll

Decompiled 2 days 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 BepInEx;
using BepInEx.Logging;
using Dawn;
using Dawn.Utils;
using Dusk;
using GameNetcodeStuff;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using ProjectSCP.SCP3166.NetcodePatcher;
using TMPro;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Animations.Rigging;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("ProjectSCP.SCP3166")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.1.0")]
[assembly: AssemblyInformationalVersion("1.0.1+34f21188a8b367da196f577084717c38e72d28eb")]
[assembly: AssemblyProduct("SCP3166")]
[assembly: AssemblyTitle("ProjectSCP.SCP3166")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.1.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
[module: NetcodePatchedAssembly]
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 SCP3166
{
	internal class GarfieldPhoneBehavior : PhysicsProp
	{
		public enum State
		{
			Off,
			Main,
			Orbit
		}

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

			private object <>2__current;

			public GarfieldPhoneBehavior <>4__this;

			private float <waitTimeIntervals>5__1;

			private List<LasagnaBehavior>.Enumerator <>s__2;

			private LasagnaBehavior <lasagna>5__3;

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

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

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

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>s__2 = default(List<LasagnaBehavior>.Enumerator);
				<lasagna>5__3 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0071: Unknown result type (might be due to invalid IL or missing references)
				//IL_007b: Expected O, but got Unknown
				//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b2: Expected O, but got Unknown
				//IL_00df: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e9: Expected O, but got Unknown
				//IL_0115: Unknown result type (might be due to invalid IL or missing references)
				//IL_011f: Expected O, but got Unknown
				//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
				//IL_01f0: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<waitTimeIntervals>5__1 = 1f;
					((TMP_Text)<>4__this.LocatingLasagnaText).text = "Locating Lasagna";
					<>2__current = (object)new WaitForSeconds(<waitTimeIntervals>5__1);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					((TMP_Text)<>4__this.LocatingLasagnaText).text = "Locating Lasagna.";
					<>2__current = (object)new WaitForSeconds(<waitTimeIntervals>5__1);
					<>1__state = 2;
					return true;
				case 2:
					<>1__state = -1;
					((TMP_Text)<>4__this.LocatingLasagnaText).text = "Locating Lasagna..";
					<>2__current = (object)new WaitForSeconds(<waitTimeIntervals>5__1);
					<>1__state = 3;
					return true;
				case 3:
					<>1__state = -1;
					((TMP_Text)<>4__this.LocatingLasagnaText).text = "Locating Lasagna...";
					<>2__current = (object)new WaitForSeconds(1f);
					<>1__state = 4;
					return true;
				case 4:
					<>1__state = -1;
					if ((Object)(object)Plugin.localPlayer == (Object)(object)<>4__this.previousPlayerHeldBy)
					{
						<>s__2 = LasagnaBehavior.Instances.GetEnumerator();
						try
						{
							while (<>s__2.MoveNext())
							{
								<lasagna>5__3 = <>s__2.Current;
								<lasagna>5__3.ShowLocation(5f);
								<lasagna>5__3 = null;
							}
						}
						finally
						{
							((IDisposable)<>s__2).Dispose();
						}
						<>s__2 = default(List<LasagnaBehavior>.Enumerator);
					}
					((TMP_Text)<>4__this.LocatingLasagnaText).text = $"Found {LasagnaBehavior.Instances.Count} lasagna";
					<>2__current = (object)new WaitForSeconds(5f);
					<>1__state = 5;
					return true;
				case 5:
					<>1__state = -1;
					((TMP_Text)<>4__this.LocatingLasagnaText).text = "";
					<>4__this.scanningForLasagna = 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();
			}
		}

		public AudioSource ItemAudio;

		public AudioClip WelcomeSFX;

		public AudioClip PingSFX;

		public TextMeshProUGUI GorefieldDistanceText;

		public TextMeshProUGUI ClosestLasagnaText;

		public TextMeshProUGUI LocatingLasagnaText;

		public GameObject FlashlightIcon;

		public Slider BatterySlider;

		public SpriteRenderer GorefieldStatusRenderer;

		public GameObject MainPanel;

		public GameObject OrbitPanel;

		public SCP3166AI? trackingInstance;

		private PlayerControllerB? previousPlayerHeldBy;

		public State CurrentState = State.Off;

		private bool flashlightToggle;

		private const int flashlightID = 1;

		private bool scanningForLasagna;

		private const float lasagnaDetectorTime = 5f;

		private const float lasagnaLocatorScanTime = 3f;

		public override void Start()
		{
			((GrabbableObject)this).Start();
			SwitchState(State.Off);
			((GrabbableObject)this).insertedBattery.charge = 1f;
		}

		public override void Update()
		{
			//IL_0070: 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_0146: Unknown result type (might be due to invalid IL or missing references)
			((GrabbableObject)this).Update();
			BatterySlider.value = ((GrabbableObject)this).insertedBattery.charge;
			if (StartOfRound.Instance.inShipPhase && CurrentState != State.Orbit && CurrentState != 0)
			{
				SwitchState(State.Orbit);
			}
			if (CurrentState == State.Main)
			{
				trackingInstance = SCP3166AI.Instances.GetClosestToPosition(((Component)this).transform.position, (SCP3166AI x) => ((Component)x).transform.position);
				float closestLasagnaDistance = GetClosestLasagnaDistance(2000f);
				if (closestLasagnaDistance == -1f)
				{
					((TMP_Text)ClosestLasagnaText).text = "Closest Lasagna: N/A";
				}
				else
				{
					((TMP_Text)ClosestLasagnaText).text = "Closest Lasagna: " + closestLasagnaDistance.ToString("F1");
				}
				if ((Object)(object)trackingInstance != (Object)null && (Object)(object)((GrabbableObject)this).playerHeldBy != (Object)null && ((GrabbableObject)this).isInFactory)
				{
					((TMP_Text)GorefieldDistanceText).text = "Distance To Gorefield: " + Vector3.Distance(((Component)((GrabbableObject)this).playerHeldBy).transform.position, ((Component)trackingInstance).gameObject.transform.position).ToString("F1");
				}
				else
				{
					((TMP_Text)GorefieldDistanceText).text = "Distance To Gorefield: N/A";
				}
			}
		}

		public override void ItemActivate(bool used, bool buttonDown = true)
		{
			if (buttonDown && CurrentState == State.Main && !((Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null))
			{
				flashlightToggle = !flashlightToggle;
				FlashlightIcon.SetActive(flashlightToggle);
				((GrabbableObject)this).playerHeldBy.ChangeHelmetLight(1, flashlightToggle);
				((GrabbableObject)this).UseItemBatteries(false, true);
			}
		}

		public override void EquipItem()
		{
			((PhysicsProp)this).EquipItem();
			if (!((Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null))
			{
				previousPlayerHeldBy = ((GrabbableObject)this).playerHeldBy;
				((GrabbableObject)this).playerHeldBy.equippedUsableItemQE = true;
				if (!((Object)(object)Plugin.localPlayer != (Object)(object)((GrabbableObject)this).playerHeldBy))
				{
					HUDManager.Instance.DisplayTip("Phone Tip", "Press 'E' to show lasagna through walls. Read tooltips at top right for more.", false, true, "GP_Phone_Tip1");
				}
			}
		}

		public override void PocketItem()
		{
			SwitchState(State.Off);
			((GrabbableObject)this).playerHeldBy.equippedUsableItemQE = false;
			((GrabbableObject)this).PocketItem();
		}

		public override void DiscardItem()
		{
			flashlightToggle = false;
			FlashlightIcon.SetActive(flashlightToggle);
			previousPlayerHeldBy.ChangeHelmetLight(1, flashlightToggle);
			((GrabbableObject)this).playerHeldBy.equippedUsableItemQE = false;
			((GrabbableObject)this).DiscardItem();
		}

		public override void UseUpBatteries()
		{
			((GrabbableObject)this).UseUpBatteries();
			SwitchState(State.Off);
		}

		public override void ItemInteractLeftRight(bool right)
		{
			((GrabbableObject)this).ItemInteractLeftRight(right);
			if ((Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null || scanningForLasagna || ((GrabbableObject)this).insertedBattery.empty)
			{
				return;
			}
			if (!right)
			{
				Plugin.logger.LogDebug((object)"Toggle power");
				if (CurrentState == State.Off)
				{
					if (StartOfRound.Instance.inShipPhase)
					{
						SwitchState(State.Orbit);
					}
					else
					{
						SwitchState(State.Main);
					}
				}
				else
				{
					SwitchState(State.Off);
				}
			}
			else
			{
				Plugin.logger.LogDebug((object)"Locate lasagna");
				if (!StartOfRound.Instance.inShipPhase && ((GrabbableObject)this).playerHeldBy.isInsideFactory && CurrentState != 0)
				{
					scanningForLasagna = true;
					((MonoBehaviour)this).StartCoroutine(LocateLasagnaCoroutine());
				}
			}
		}

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

		public void SwitchState(State state)
		{
			Plugin.logger.LogDebug((object)("Switching state to " + state));
			State currentState = CurrentState;
			CurrentState = state;
			MainPanel.SetActive(false);
			OrbitPanel.SetActive(false);
			switch (CurrentState)
			{
			case State.Off:
				((GrabbableObject)this).UseItemBatteries(false, false);
				flashlightToggle = false;
				FlashlightIcon.SetActive(flashlightToggle);
				if (!((Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null))
				{
					((GrabbableObject)this).playerHeldBy.ChangeHelmetLight(1, flashlightToggle);
				}
				break;
			case State.Main:
				MainPanel.SetActive(true);
				((GrabbableObject)this).UseItemBatteries(false, true);
				if (currentState != 0)
				{
				}
				break;
			case State.Orbit:
				OrbitPanel.SetActive(true);
				((GrabbableObject)this).UseItemBatteries(false, true);
				break;
			}
		}

		private float GetClosestLasagnaDistance(float maxDistance)
		{
			//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)
			float num = maxDistance;
			foreach (LasagnaBehavior instance in LasagnaBehavior.Instances)
			{
				float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)instance).transform.position);
				if (!(num2 > num))
				{
					num = num2;
				}
			}
			if (num == maxDistance)
			{
				return -1f;
			}
			return num;
		}

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

		protected override void __initializeRpcs()
		{
			((PhysicsProp)this).__initializeRpcs();
		}

		[MethodImpl(MethodImplOptions.NoInlining)]
		protected internal override string __getTypeName()
		{
			return "GarfieldPhoneBehavior";
		}
	}
	internal class GarfieldPhoneStatusAnimator : MonoBehaviour
	{
		public GarfieldPhoneBehavior mainScript;

		public Animator StatusAnimator;

		public void Update()
		{
			if ((Object)(object)mainScript.trackingInstance != (Object)null)
			{
				StatusAnimator.SetInteger("state", ((EnemyAI)mainScript.trackingInstance).currentBehaviourStateIndex);
			}
			else
			{
				StatusAnimator.SetInteger("state", -1);
			}
		}
	}
	public class LasagnaBehavior : PhysicsProp
	{
		public Material MainMaterial;

		public Material OverlayMaterial;

		private float showLasagnaTimer;

		private bool showingLasagna;

		public static List<LasagnaBehavior> Instances { get; private set; } = new List<LasagnaBehavior>();


		public override void Start()
		{
			((GrabbableObject)this).Start();
			Instances.Add(this);
		}

		public override void Update()
		{
			((GrabbableObject)this).Update();
			if (((GrabbableObject)this).isHeld)
			{
				if (showingLasagna)
				{
					showLasagnaTimer = 0f;
					ShowLocation(value: false);
				}
			}
			else if (showLasagnaTimer > 0f)
			{
				showLasagnaTimer -= Time.deltaTime;
			}
			else if (showingLasagna)
			{
				ShowLocation(value: false);
			}
		}

		public override void OnDestroy()
		{
			((NetworkBehaviour)this).OnDestroy();
			Instances.Remove(this);
		}

		public void ShowLocation(float time)
		{
			showLasagnaTimer = time;
			ShowLocation(value: true);
		}

		public void ShowLocation(bool value)
		{
			if (((GrabbableObject)this).isHeld)
			{
				value = false;
			}
			if (value != showingLasagna)
			{
				((Renderer)((GrabbableObject)this).mainObjectRenderer).material = (value ? OverlayMaterial : MainMaterial);
				showingLasagna = value;
			}
		}

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

		protected override void __initializeRpcs()
		{
			((PhysicsProp)this).__initializeRpcs();
		}

		[MethodImpl(MethodImplOptions.NoInlining)]
		protected internal override string __getTypeName()
		{
			return "LasagnaBehavior";
		}
	}
	[BepInPlugin("ProjectSCP.SCP3166", "SCP3166", "1.0.1")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		private readonly Harmony harmony = new Harmony("ProjectSCP.SCP3166");

		public static Plugin Instance { get; private set; }

		public static ManualLogSource logger { get; private set; }

		public static DuskMod Mod { get; private set; }

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

		public static bool IsServerOrHost => NetworkManager.Singleton.IsServer || NetworkManager.Singleton.IsHost;

		public static PlayerControllerB PlayerFromId(ulong id)
		{
			return StartOfRound.Instance.allPlayerScripts.Where((PlayerControllerB x) => x.actualClientId == id).First();
		}

		private void Awake()
		{
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			logger = ((BaseUnityPlugin)Instance).Logger;
			harmony.PatchAll();
			AssetBundle val = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), "scp3166_mainassets"));
			Mod = DuskMod.RegisterMod((BaseUnityPlugin)(object)this, val);
			Mod.RegisterContentHandlers();
			InitializeNetworkBehaviours();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"ProjectSCP.SCP3166 v1.0.1 has loaded!");
		}

		private static void InitializeNetworkBehaviours()
		{
			Type[] types = Assembly.GetExecutingAssembly().GetTypes();
			Type[] array = types;
			foreach (Type type in array)
			{
				MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
				MethodInfo[] array2 = methods;
				foreach (MethodInfo methodInfo in array2)
				{
					object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
					if (customAttributes.Length != 0)
					{
						methodInfo.Invoke(null, null);
					}
				}
			}
			logger.LogDebug((object)"Finished initializing network behaviours");
		}
	}
	internal class SCP3166AI : EnemyAI
	{
		public enum State
		{
			Roaming,
			Following,
			Hunger,
			Rage
		}

		[CompilerGenerated]
		private sealed class <<EatPlayerClientRpc>g__EatPlayerCoroutine|120_0>d : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public PlayerControllerB player;

			public float eatTime;

			public SCP3166AI <>4__this;

			private DeadBodyInfo <body>5__1;

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

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

			[DebuggerHidden]
			public <<EatPlayerClientRpc>g__EatPlayerCoroutine|120_0>d(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

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

			private bool MoveNext()
			{
				//IL_012a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0134: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					Plugin.logger.LogDebug((object)$"Eating player for {eatTime} seconds");
					<>2__current = null;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					((EnemyAI)<>4__this).inSpecialAnimation = true;
					<body>5__1 = player.deadBody;
					<body>5__1.attachedTo = <>4__this.EatingPlayerTransform;
					<body>5__1.attachedLimb = <body>5__1.bodyParts[5];
					<body>5__1.matchPositionExactly = true;
					((EnemyAI)<>4__this).creatureVoice.Stop();
					((EnemyAI)<>4__this).creatureVoice.clip = <>4__this.EatingPlayerSFX;
					((EnemyAI)<>4__this).creatureVoice.loop = true;
					((EnemyAI)<>4__this).creatureVoice.Play();
					((EnemyAI)<>4__this).creatureAnimator.SetBool("eating", true);
					<>2__current = (object)new WaitForSeconds(eatTime);
					<>1__state = 2;
					return true;
				case 2:
					<>1__state = -1;
					<body>5__1.attachedTo = null;
					<body>5__1.attachedLimb = null;
					<body>5__1.matchPositionExactly = false;
					<body>5__1.DeactivateBody(false);
					((EnemyAI)<>4__this).creatureAnimator.SetBool("eating", false);
					((EnemyAI)<>4__this).creatureVoice.Stop();
					((EnemyAI)<>4__this).creatureVoice.loop = false;
					((EnemyAI)<>4__this).inSpecialAnimation = false;
					<>4__this.targetPlayer = null;
					<>4__this.timeSinceEatingLasagna = 0f;
					<>4__this.playedHalfHungerSFX = false;
					if (<>4__this.Size + <>4__this.sizeIncreasePerLasagna <= <>4__this.maxSize)
					{
						<>4__this.Size += <>4__this.sizeIncreasePerLasagna;
						<>4__this.gorefieldDamage += <>4__this.damageIncreasePerLasagna;
					}
					<>4__this.timeSinceChatter = 0f;
					if (Plugin.IsServerOrHost)
					{
						<>4__this.PlayClip("PostEatingPlayerSFX");
					}
					<>4__this.SwitchToBehaviourStateOnLocalClient(0);
					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 <<FeedLasagnaClientRpc>g__EatLasagnaCoroutine|119_0>d : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public float eatTime;

			public SCP3166AI <>4__this;

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

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

			[DebuggerHidden]
			public <<FeedLasagnaClientRpc>g__EatLasagnaCoroutine|119_0>d(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

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

			private bool MoveNext()
			{
				//IL_00df: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e9: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					Plugin.logger.LogDebug((object)$"Eating lasagna for {eatTime} seconds");
					<>2__current = null;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					((EnemyAI)<>4__this).inSpecialAnimation = true;
					((EnemyAI)<>4__this).creatureVoice.Stop();
					((EnemyAI)<>4__this).creatureVoice.clip = <>4__this.EatingLasagnaSFX;
					((EnemyAI)<>4__this).creatureVoice.loop = true;
					((EnemyAI)<>4__this).creatureVoice.Play();
					((EnemyAI)<>4__this).creatureAnimator.SetBool("eating", true);
					<>2__current = (object)new WaitForSeconds(eatTime);
					<>1__state = 2;
					return true;
				case 2:
					<>1__state = -1;
					((EnemyAI)<>4__this).creatureAnimator.SetBool("eating", false);
					((EnemyAI)<>4__this).creatureVoice.Stop();
					((EnemyAI)<>4__this).creatureVoice.loop = false;
					((EnemyAI)<>4__this).inSpecialAnimation = false;
					<>4__this.targetPlayer = null;
					<>4__this.timeSinceEatingLasagna = 0f;
					<>4__this.playedHalfHungerSFX = false;
					if (<>4__this.Size + <>4__this.sizeIncreasePerLasagna <= <>4__this.maxSize)
					{
						<>4__this.Size += <>4__this.sizeIncreasePerLasagna;
						<>4__this.gorefieldDamage += <>4__this.damageIncreasePerLasagna;
					}
					<>4__this.timeSinceChatter = 0f;
					if (((NetworkBehaviour)<>4__this).IsServer)
					{
						<>4__this.PlayClip("PostEatingLasagnaSFX");
					}
					<>4__this.SwitchToBehaviourStateOnLocalClient(0);
					if (((NetworkBehaviour)<>4__this).IsServer && <>4__this.spawnLasagnaWhenSpawned)
					{
						<>4__this.SpawnLasagna();
					}
					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 SmartAgentNavigator nav;

		public Transform turnCompass;

		public InteractTrigger LasagnaTrigger;

		public Transform EatingPlayerTransform;

		public AudioClip EatingPlayerSFX;

		public AudioClip EatingLasagnaSFX;

		public AudioClip[] FootstepSFX;

		public AudioClip[] FoundPlayerSFX;

		public AudioClip[] DemandLasagnaSFX;

		public AudioClip[] HalfHungerSFX;

		public AudioClip[] SmellsLasagnaSFX;

		public AudioClip[] FollowingChatterSFX;

		public AudioClip[] RageChatterSFX;

		public AudioClip[] StartRageSFX;

		public AudioClip[] PostEatingLasagnaSFX;

		public AudioClip[] PostEatingPlayerSFX;

		public AudioClip[] HurtByPlayerSFX;

		public AudioClip[] ShotByPlayerSFX;

		private Random random;

		private NetworkVariable<ulong> targetPlayerId = new NetworkVariable<ulong>(0uL, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);

		public Dictionary<string, AudioClip[]> VoiceLines = new Dictionary<string, AudioClip[]>();

		private float timeSinceSwitchBehavior;

		private float timeSinceEatingLasagna;

		private float timeSinceDemandLasagna;

		private float timeSinceDamagePlayer;

		private float timeSinceFollowPlayer;

		private float timeSinceChatter;

		private float nextChatterTime = 10f;

		private float hungerMultiplier = 1f;

		private bool playedHalfHungerSFX;

		private bool targetPlayerHasLasagna;

		private bool reachedPlayerWithLasagna;

		private float idleTime;

		private float currentSpeed;

		private Vector3 lastPosition;

		private int gorefieldDamage;

		private List<EntranceTeleport> entrances = new List<EntranceTeleport>();

		private bool roaming;

		private int hashSpeed;

		private const float followDistance = 5f;

		private const int demandLasagnaVLAmount = 5;

		private readonly BoundedRange followChatterCooldown = new BoundedRange(30f, 60f);

		private readonly BoundedRange chaseChatterCooldown = new BoundedRange(10f, 20f);

		private const float lasagnaHeldHungerMultiplierIncrease = 0.5f;

		private const float followPlayerCooldown = 10f;

		public static List<SCP3166AI> Instances { get; private set; } = new List<SCP3166AI>();


		private PlayerControllerB? targetPlayer
		{
			get
			{
				return Plugin.PlayerFromId(targetPlayerId.Value);
			}
			set
			{
				targetPlayerId.Value = (((Object)(object)value != (Object)null) ? value.actualClientId : 0);
			}
		}

		public float Size
		{
			get
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				return ((Component)this).transform.localScale.y;
			}
			private set
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				((Component)this).transform.localScale = new Vector3(value, value, value);
			}
		}

		private float halfwayToRageTime => hungerPhaseCooldown + ragePhaseCooldown / 2f;

		private float demandLasagnaCooldown => ragePhaseCooldown / 5f;

		public bool isOutside => nav.IsAgentOutside();

		public bool isInsideFactory => !isOutside;

		private float sniffDistance => 6f;

		private bool spawnLasagnaWhenSpawned => ((AssetBundleLoader<SCP3166ContentHandler.SCP3166Assets>)(object)ContentHandler<SCP3166ContentHandler>.Instance.SCP3166).GetConfig<bool>("Spawn Lasagna When Spawned").Value;

		private bool showLasagnaInHungerPhase => ((AssetBundleLoader<SCP3166ContentHandler.SCP3166Assets>)(object)ContentHandler<SCP3166ContentHandler>.Instance.SCP3166).GetConfig<bool>("Show Lasagna In Hunger Phase").Value;

		private int spawnLasagnaAmount => ((AssetBundleLoader<SCP3166ContentHandler.SCP3166Assets>)(object)ContentHandler<SCP3166ContentHandler>.Instance.SCP3166).GetConfig<int>("Spawn Lasagna Amount").Value;

		private int startDamage => ((AssetBundleLoader<SCP3166ContentHandler.SCP3166Assets>)(object)ContentHandler<SCP3166ContentHandler>.Instance.SCP3166).GetConfig<int>("Start Damage").Value;

		private int damageIncreasePerLasagna => ((AssetBundleLoader<SCP3166ContentHandler.SCP3166Assets>)(object)ContentHandler<SCP3166ContentHandler>.Instance.SCP3166).GetConfig<int>("Damage Increase Per Lasagna").Value;

		private float hungerPhaseCooldown => ((AssetBundleLoader<SCP3166ContentHandler.SCP3166Assets>)(object)ContentHandler<SCP3166ContentHandler>.Instance.SCP3166).GetConfig<float>("Hunger Phase Cooldown").Value;

		private float ragePhaseCooldown => ((AssetBundleLoader<SCP3166ContentHandler.SCP3166Assets>)(object)ContentHandler<SCP3166ContentHandler>.Instance.SCP3166).GetConfig<float>("Rage Phase Cooldown").Value;

		private float distanceToLoseGorefield => ((AssetBundleLoader<SCP3166ContentHandler.SCP3166Assets>)(object)ContentHandler<SCP3166ContentHandler>.Instance.SCP3166).GetConfig<float>("Distance To Lose Gorefield").Value;

		private float startingSize => ((AssetBundleLoader<SCP3166ContentHandler.SCP3166Assets>)(object)ContentHandler<SCP3166ContentHandler>.Instance.SCP3166).GetConfig<float>("Starting Size").Value;

		private float maxSize => ((AssetBundleLoader<SCP3166ContentHandler.SCP3166Assets>)(object)ContentHandler<SCP3166ContentHandler>.Instance.SCP3166).GetConfig<float>("Max Size").Value;

		private float sizeIncreasePerLasagna => ((AssetBundleLoader<SCP3166ContentHandler.SCP3166Assets>)(object)ContentHandler<SCP3166ContentHandler>.Instance.SCP3166).GetConfig<float>("Size Increase Per Lasagna").Value;

		private float timeToEat => ((AssetBundleLoader<SCP3166ContentHandler.SCP3166Assets>)(object)ContentHandler<SCP3166ContentHandler>.Instance.SCP3166).GetConfig<float>("Time To Eat").Value;

		private float hungerMultiplierIncreasePerLasagna => ((AssetBundleLoader<SCP3166ContentHandler.SCP3166Assets>)(object)ContentHandler<SCP3166ContentHandler>.Instance.SCP3166).GetConfig<float>("Hunger Multiplier Increase Per Lasagna").Value;

		public override void Start()
		{
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Expected O, but got Unknown
			//IL_00cf: 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)
			Instances.Add(this);
			nav.SetAllValues(false);
			base.allAINodes = Utils.allAINodes;
			entrances = Object.FindObjectsOfType<EntranceTeleport>(false).ToList();
			base.overlapColliders = (Collider[])(object)new Collider[1];
			base.thisNetworkObject = ((NetworkBehaviour)this).NetworkObject;
			base.thisEnemyIndex = RoundManager.Instance.numberOfEnemiesInScene;
			random = new Random(StartOfRound.Instance.randomMapSeed + base.thisEnemyIndex);
			RoundManager instance = RoundManager.Instance;
			instance.numberOfEnemiesInScene++;
			if (!((NetworkBehaviour)this).IsServer)
			{
				RoundManager.Instance.SpawnedEnemies.Add((EnemyAI)(object)this);
			}
			base.path1 = new NavMeshPath();
			base.openDoorSpeedMultiplier = base.enemyType.doorSpeedMultiplier;
			base.serverPosition = ((Component)this).transform.position;
			base.ventAnimationFinished = true;
			base.currentBehaviourStateIndex = 0;
			hashSpeed = Animator.StringToHash("speed");
			Size = startingSize;
			gorefieldDamage = startDamage;
			VoiceLines.Add("FoundPlayerSFX", FoundPlayerSFX);
			VoiceLines.Add("DemandLasagnaSFX", DemandLasagnaSFX);
			VoiceLines.Add("HalfHungerSFX", HalfHungerSFX);
			VoiceLines.Add("SmellsLasagnaSFX", SmellsLasagnaSFX);
			VoiceLines.Add("FollowingChatterSFX", FollowingChatterSFX);
			VoiceLines.Add("RageChatterSFX", RageChatterSFX);
			VoiceLines.Add("StartRageSFX", StartRageSFX);
			VoiceLines.Add("PostEatingLasagnaSFX", PostEatingLasagnaSFX);
			VoiceLines.Add("PostEatingPlayerSFX", PostEatingPlayerSFX);
			VoiceLines.Add("HurtByPlayerSFX", HurtByPlayerSFX);
			VoiceLines.Add("ShotByPlayerSFX", ShotByPlayerSFX);
			if (((NetworkBehaviour)this).IsServer && spawnLasagnaWhenSpawned)
			{
				SpawnLasagna(spawnLasagnaAmount);
			}
		}

		public override void OnDestroy()
		{
			Instances.Remove(this);
			((EnemyAI)this).OnDestroy();
		}

		public override void Update()
		{
			//IL_013c: Unknown result type (might be due to invalid IL or missing references)
			if (StartOfRound.Instance.allPlayersDead || base.inSpecialAnimation)
			{
				return;
			}
			timeSinceSwitchBehavior += Time.deltaTime;
			timeSinceDamagePlayer += Time.deltaTime;
			timeSinceFollowPlayer += Time.deltaTime;
			timeSinceChatter += Time.deltaTime;
			LasagnaTrigger.interactable = PlayerHasLasagna(Plugin.localPlayer, checkIfHolding: true);
			ShowLasagnaIfPlayerTargetted();
			if (((NetworkBehaviour)this).IsServer)
			{
				float num = (targetPlayerHasLasagna ? (hungerMultiplier + 0.5f) : hungerMultiplier);
				timeSinceEatingLasagna += Time.deltaTime * num;
				timeSinceDemandLasagna += Time.deltaTime * num;
				if (base.updateDestinationInterval >= 0f)
				{
					base.updateDestinationInterval -= Time.deltaTime;
				}
				else
				{
					((EnemyAI)this).DoAIInterval();
					base.updateDestinationInterval = base.AIIntervalTime + Random.Range(-0.015f, 0.015f);
				}
				if (base.moveTowardsDestination)
				{
					nav.DoPathingToDestination(base.destination);
				}
			}
		}

		public void LateUpdate()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_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)
			Vector3 val = ((Component)this).transform.position - lastPosition;
			currentSpeed = ((Vector3)(ref val)).magnitude / Time.deltaTime / 2f;
			lastPosition = ((Component)this).transform.position;
			base.creatureAnimator.SetFloat(hashSpeed, currentSpeed);
			idleTime = ((currentSpeed <= 0f) ? (idleTime + Time.deltaTime) : 0f);
		}

		public override void DoAIInterval()
		{
			//IL_0104: 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_0413: 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_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b4: 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)
			switch (base.currentBehaviourStateIndex)
			{
			case 0:
				base.agent.speed = 5f;
				base.agent.stoppingDistance = 0f;
				if (timeSinceFollowPlayer > 10f && TargetClosestPlayer(distanceToLoseGorefield, requireLineOfSight: true))
				{
					SwitchToBehaviourClientRpc(1);
				}
				else if (timeSinceEatingLasagna > hungerPhaseCooldown)
				{
					SwitchToBehaviourClientRpc(2);
				}
				break;
			case 1:
				base.agent.speed = 5f;
				base.agent.stoppingDistance = 5f;
				if (timeSinceEatingLasagna > hungerPhaseCooldown)
				{
					SwitchToBehaviourClientRpc(2);
				}
				else if (!TargetClosestPlayer(distanceToLoseGorefield) || !SetDestinationToPosition(((Component)targetPlayer).transform.position))
				{
					Plugin.logger.LogDebug((object)"Following: Lost target player...");
					targetPlayer = null;
					timeSinceFollowPlayer = 0f;
					SwitchToBehaviourClientRpc(0);
				}
				else if (targetPlayerHasLasagna && !reachedPlayerWithLasagna && Vector3.Distance(((Component)this).transform.position, ((Component)targetPlayer).transform.position) < sniffDistance)
				{
					reachedPlayerWithLasagna = true;
					DoAnimationClientRpc("smell");
					PlayClip("SmellsLasagnaSFX");
				}
				else if (timeSinceChatter > nextChatterTime)
				{
					timeSinceChatter = 0f;
					nextChatterTime = followChatterCooldown.GetRandomInRange(random);
					PlayClip("FollowingChatterSFX");
				}
				break;
			case 2:
				base.agent.speed = 6f;
				base.agent.stoppingDistance = 5f;
				if (timeSinceEatingLasagna > ragePhaseCooldown + hungerPhaseCooldown)
				{
					SwitchToBehaviourClientRpc(3);
				}
				else if (TargetClosestPlayer(float.PositiveInfinity) && SetDestinationToPosition(((Component)targetPlayer).transform.position))
				{
					if (roaming)
					{
						nav.StopSearchRoutine();
						roaming = false;
					}
					if (targetPlayerHasLasagna && !reachedPlayerWithLasagna && Vector3.Distance(((Component)this).transform.position, ((Component)targetPlayer).transform.position) < sniffDistance)
					{
						reachedPlayerWithLasagna = true;
						DoAnimationClientRpc("smell");
						PlayClip("SmellsLasagnaSFX");
						break;
					}
					if (timeSinceEatingLasagna > halfwayToRageTime && !playedHalfHungerSFX)
					{
						playedHalfHungerSFX = true;
						timeSinceDemandLasagna = 0f;
						PlayClip("HalfHungerSFX");
					}
					if (timeSinceDemandLasagna > demandLasagnaCooldown)
					{
						timeSinceDemandLasagna = 0f;
						PlayClip("DemandLasagnaSFX");
					}
				}
				else if (!roaming)
				{
					nav.StartSearchRoutine(float.PositiveInfinity);
					roaming = true;
				}
				break;
			case 3:
				base.agent.speed = 10f;
				base.agent.stoppingDistance = 0f;
				if (CheckForDeadBodies(3f))
				{
					base.inSpecialAnimation = true;
					EatPlayerClientRpc(targetPlayer.actualClientId);
				}
				else if (TargetClosestPlayer(float.PositiveInfinity) && SetDestinationToPosition(((Component)targetPlayer).transform.position))
				{
					if (roaming)
					{
						nav.StopSearchRoutine();
						roaming = false;
					}
					if (timeSinceChatter > nextChatterTime)
					{
						timeSinceChatter = 0f;
						nextChatterTime = chaseChatterCooldown.GetRandomInRange(random);
						PlayClip("RageChatterSFX");
					}
				}
				else if (!roaming)
				{
					nav.StartSearchRoutine(float.PositiveInfinity);
					roaming = true;
				}
				break;
			default:
				Plugin.logger.LogWarning((object)("Invalid state: " + base.currentBehaviourStateIndex));
				break;
			}
		}

		public bool CheckForDeadBodies(float range)
		{
			//IL_003a: 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)
			PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
			foreach (PlayerControllerB val in allPlayerScripts)
			{
				if (val.isPlayerDead && !((Object)(object)val.deadBody == (Object)null) && !(Vector3.Distance(((Component)this).transform.position, ((Component)val.deadBody).transform.position) > range))
				{
					targetPlayer = val;
					return true;
				}
			}
			return false;
		}

		public void SpawnLasagna(int amount = 1)
		{
			//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: 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_0029: Unknown result type (might be due to invalid IL or missing references)
			for (int i = 0; i < amount; i++)
			{
				Vector3 position = Utils.allAINodes.GetRandom().transform.position;
				Utils.SpawnItem(SCP3166Keys.Lasagna, position);
			}
		}

		public bool TargetClosestPlayer(float mostOptimalDistance, bool requireLineOfSight = false, float viewWidth = 70f)
		{
			//IL_0047: 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_00e4: 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_0117: Unknown result type (might be due to invalid IL or missing references)
			targetPlayer = null;
			targetPlayerHasLasagna = false;
			PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
			foreach (PlayerControllerB val in allPlayerScripts)
			{
				if (((EnemyAI)this).PlayerIsTargetable(val, false, false) && PlayerHasLasagna(val))
				{
					base.tempDist = Vector3.Distance(((Component)this).transform.position, ((Component)val).transform.position);
					if (base.tempDist < mostOptimalDistance)
					{
						mostOptimalDistance = base.tempDist;
						targetPlayer = val;
						targetPlayerHasLasagna = true;
					}
				}
			}
			if ((Object)(object)targetPlayer == (Object)null)
			{
				PlayerControllerB[] allPlayerScripts2 = StartOfRound.Instance.allPlayerScripts;
				foreach (PlayerControllerB val2 in allPlayerScripts2)
				{
					if (((EnemyAI)this).PlayerIsTargetable(val2, false, false) && (!requireLineOfSight || ((EnemyAI)this).CheckLineOfSightForPosition(((Component)val2.gameplayCamera).transform.position, viewWidth, 40, -1f, (Transform)null)))
					{
						base.tempDist = Vector3.Distance(((Component)this).transform.position, ((Component)val2).transform.position);
						if (base.tempDist < mostOptimalDistance)
						{
							mostOptimalDistance = base.tempDist;
							targetPlayer = val2;
						}
					}
				}
			}
			return (Object)(object)targetPlayer != (Object)null;
		}

		private void ShowLasagnaIfPlayerTargetted()
		{
			if (!showLasagnaInHungerPhase || !((Object)(object)targetPlayer != (Object)null) || !((Object)(object)targetPlayer == (Object)(object)Plugin.localPlayer) || (base.currentBehaviourStateIndex != 2 && base.currentBehaviourStateIndex != 3))
			{
				return;
			}
			foreach (LasagnaBehavior item in LasagnaBehavior.Instances.ToList())
			{
				item.ShowLocation(10f);
			}
		}

		private bool PlayerHasLasagna(PlayerControllerB player, bool checkIfHolding = false)
		{
			if ((Object)(object)player.currentlyHeldObjectServer != (Object)null && ((Object)player.currentlyHeldObjectServer.itemProperties).name == ((Object)((Registry<DawnItemInfo>)(object)LethalContent.Items)[SCP3166Keys.Lasagna].Item).name)
			{
				return true;
			}
			if (checkIfHolding)
			{
				return false;
			}
			foreach (GrabbableObject item in player.ItemSlots.ToList())
			{
				if ((Object)(object)item != (Object)null && ((Object)item.itemProperties).name == ((Object)((Registry<DawnItemInfo>)(object)LethalContent.Items)[SCP3166Keys.Lasagna].Item).name)
				{
					return true;
				}
			}
			return false;
		}

		public bool SetDestinationToPosition(Vector3 position, bool checkForPath = false)
		{
			//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_000e: Unknown result type (might be due to invalid IL or missing references)
			base.destination = position;
			return nav.DoPathingToDestination(position);
		}

		public bool SmartCanPathToPoint(Vector3 position)
		{
			//IL_000d: 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_007b: 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_0090: 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_00c4: 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_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_00ec: 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_0105: 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)
			if (nav.CanPathToPoint(((Component)this).transform.position, position) > 0f)
			{
				return true;
			}
			foreach (EntranceTeleport entrance in entrances)
			{
				if (!(isInsideFactory ? (!entrance.isEntranceToBuilding) : entrance.isEntranceToBuilding))
				{
					continue;
				}
				Vector3 navMeshPosition = RoundManager.Instance.GetNavMeshPosition(entrance.entrancePoint.position, RoundManager.Instance.navHit, 5f, -1);
				if (!((Object)(object)entrance.exitPoint == (Object)null) || entrance.FindExitPoint())
				{
					Vector3 navMeshPosition2 = RoundManager.Instance.GetNavMeshPosition(entrance.exitPoint.position, RoundManager.Instance.navHit, 5f, -1);
					if (nav.CanPathToPoint(((Component)this).transform.position, navMeshPosition) > 0f && nav.CanPathToPoint(navMeshPosition2, position) > 0f)
					{
						return true;
					}
				}
			}
			return false;
		}

		private void RepositionAgent()
		{
			//IL_000c: 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_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_002d: Unknown result type (might be due to invalid IL or missing references)
			Vector3 navMeshPosition = RoundManager.Instance.GetNavMeshPosition(((Component)this).transform.position, RoundManager.Instance.navHit, 5f, -1);
			base.agent.Warp(navMeshPosition);
		}

		public override void OnCollideWithPlayer(Collider other)
		{
			//IL_00a8: 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)
			((EnemyAI)this).OnCollideWithPlayer(other);
			PlayerControllerB val = default(PlayerControllerB);
			if (!base.inSpecialAnimation && base.currentBehaviourStateIndex == 3 && ((Component)other).gameObject.TryGetComponent<PlayerControllerB>(ref val) && !((Object)(object)val == (Object)null) && !(timeSinceDamagePlayer <= 1f) && !((Object)(object)Plugin.localPlayer != (Object)(object)val))
			{
				timeSinceDamagePlayer = 0f;
				DoAnimationServerRpc("attack");
				val.DamagePlayer(gorefieldDamage, true, true, (CauseOfDeath)6, 0, false, default(Vector3));
			}
		}

		public override void HitEnemy(int force = 1, PlayerControllerB? playerWhoHit = null, bool playHitSFX = false, int hitID = -1)
		{
			timeSinceChatter = 0f;
			Plugin.logger.LogDebug((object)"HitEnemy()");
			if (hitID == -1)
			{
				Plugin.logger.LogDebug((object)"Attempting to play clip: ShotByPlayerSFX");
				PlayClip("ShotByPlayerSFX");
			}
			else
			{
				Plugin.logger.LogDebug((object)"Attempting to play clip: HurtByPlayerSFX");
				PlayClip("HurtByPlayerSFX");
			}
		}

		public void FeedLasagna()
		{
			if (!base.inSpecialAnimation)
			{
				Plugin.logger.LogDebug((object)"Feeding Lasagna");
				Plugin.localPlayer.DespawnHeldObject();
				base.inSpecialAnimation = true;
				FeedLasagnaServerRpc();
			}
		}

		public void PlayFootstepSFX()
		{
			RoundManager.PlayRandomClip(base.creatureSFX, FootstepSFX, true, 1f, 0, 1000);
		}

		public void UnsetInSpecialAnimation()
		{
			Plugin.logger.LogDebug((object)"UnsetInSpecialAnimation");
			base.inSpecialAnimation = false;
		}

		public void BehaviorSwitchCleanup()
		{
			timeSinceChatter = 0f;
			timeSinceDemandLasagna = 0f;
			playedHalfHungerSFX = false;
			reachedPlayerWithLasagna = false;
			nav.StopSearchRoutine();
			roaming = false;
		}

		public void SwitchToBehaviourStateOnLocalClient(int stateIndex)
		{
			if (base.currentBehaviourStateIndex != stateIndex)
			{
				ManualLogSource logger = Plugin.logger;
				State state = (State)stateIndex;
				logger.LogDebug((object)("Switching behavior to: " + state));
				base.previousBehaviourStateIndex = base.currentBehaviourStateIndex;
				base.currentBehaviourStateIndex = stateIndex;
				base.currentBehaviourState = base.enemyBehaviourStates[stateIndex];
				timeSinceSwitchBehavior = 0f;
				BehaviorSwitchCleanup();
				switch (stateIndex)
				{
				case 0:
					timeSinceFollowPlayer = 0f;
					base.creatureAnimator.SetBool("rage", false);
					nav.StartSearchRoutine(float.PositiveInfinity);
					roaming = true;
					break;
				case 1:
					PlayClip("FoundPlayerSFX");
					break;
				case 2:
					PlayClip("DemandLasagnaSFX");
					break;
				case 3:
					PlayClip("StartRageSFX");
					base.creatureAnimator.SetBool("rage", true);
					break;
				}
			}
		}

		public void PlayClip(string clipName)
		{
			Plugin.logger.LogDebug((object)"In PlayClip()");
			AudioClip[] array = VoiceLines[clipName];
			float num = Random.Range(0.9f, 1.1f);
			int num2 = Random.Range(0, array.Length);
			Plugin.logger.LogDebug((object)$"Running PlayClipClientRpc({clipName}, {num2}, {num})");
			PlayClipServerRpc(clipName, num2, num);
		}

		[ServerRpc(RequireOwnership = false)]
		public void DoAnimationServerRpc(string animName)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: 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)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				ServerRpcParams val = default(ServerRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1901319177u, val, (RpcDelivery)0);
				bool flag = animName != null;
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives));
				if (flag)
				{
					((FastBufferWriter)(ref val2)).WriteValueSafe(animName, false);
				}
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1901319177u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
			{
				((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0;
				if (((NetworkBehaviour)this).IsServer)
				{
					DoAnimationClientRpc(animName);
				}
			}
		}

		[ClientRpc]
		public void DoAnimationClientRpc(string animName)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: 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)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsServer || networkManager.IsHost))
			{
				ClientRpcParams val = default(ClientRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1598392935u, val, (RpcDelivery)0);
				bool flag = animName != null;
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives));
				if (flag)
				{
					((FastBufferWriter)(ref val2)).WriteValueSafe(animName, false);
				}
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1598392935u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0;
				base.creatureAnimator.SetTrigger(animName);
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void PlayClipServerRpc(string clipName, int index, float pitch)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: 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_00af: 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_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				ServerRpcParams val = default(ServerRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1529781u, val, (RpcDelivery)0);
				bool flag = clipName != null;
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives));
				if (flag)
				{
					((FastBufferWriter)(ref val2)).WriteValueSafe(clipName, false);
				}
				BytePacker.WriteValueBitPacked(val2, index);
				((FastBufferWriter)(ref val2)).WriteValueSafe<float>(ref pitch, default(ForPrimitives));
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1529781u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
			{
				((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0;
				if (Plugin.IsServerOrHost)
				{
					PlayClipClientRpc(clipName, index, pitch);
				}
			}
		}

		[ClientRpc]
		public void PlayClipClientRpc(string clipName, int index, float pitch)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: 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_00af: 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_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsServer || networkManager.IsHost))
			{
				ClientRpcParams val = default(ClientRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(764069451u, val, (RpcDelivery)0);
				bool flag = clipName != null;
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives));
				if (flag)
				{
					((FastBufferWriter)(ref val2)).WriteValueSafe(clipName, false);
				}
				BytePacker.WriteValueBitPacked(val2, index);
				((FastBufferWriter)(ref val2)).WriteValueSafe<float>(ref pitch, default(ForPrimitives));
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 764069451u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0;
				Plugin.logger.LogDebug((object)"In PlayClipClientRpc()");
				Plugin.logger.LogDebug((object)("Playing clip " + clipName));
				base.creatureVoice.Stop();
				AudioClip[] array = VoiceLines[clipName];
				base.creatureVoice.pitch = pitch;
				base.creatureVoice.clip = array[index];
				base.creatureVoice.Play();
				WalkieTalkie.TransmitOneShotAudio(base.creatureVoice, array[index], 0.85f);
			}
		}

		[ClientRpc]
		public void SwitchToBehaviourClientRpc(int stateIndex)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: 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)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2579341352u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, stateIndex);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2579341352u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0;
					SwitchToBehaviourStateOnLocalClient(stateIndex);
				}
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void FeedLasagnaServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: 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)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				ServerRpcParams val = default(ServerRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3528172920u, val, (RpcDelivery)0);
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3528172920u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
			{
				((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0;
				if (((NetworkBehaviour)this).IsServer)
				{
					hungerMultiplier += hungerMultiplierIncreasePerLasagna;
					FeedLasagnaClientRpc();
				}
			}
		}

		[ClientRpc]
		public void FeedLasagnaClientRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: 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)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3200112956u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3200112956u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0;
					((MonoBehaviour)this).StartCoroutine(EatLasagnaCoroutine(timeToEat));
				}
			}
			[IteratorStateMachine(typeof(<<FeedLasagnaClientRpc>g__EatLasagnaCoroutine|119_0>d))]
			IEnumerator EatLasagnaCoroutine(float eatTime)
			{
				//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
				return new <<FeedLasagnaClientRpc>g__EatLasagnaCoroutine|119_0>d(0)
				{
					<>4__this = this,
					eatTime = eatTime
				};
			}
		}

		[ClientRpc]
		public void EatPlayerClientRpc(ulong clientId)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: 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)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(646144598u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, clientId);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 646144598u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0;
					PlayerControllerB player2 = Plugin.PlayerFromId(clientId);
					((MonoBehaviour)this).StartCoroutine(EatPlayerCoroutine(player2, timeToEat));
				}
			}
			[IteratorStateMachine(typeof(<<EatPlayerClientRpc>g__EatPlayerCoroutine|120_0>d))]
			IEnumerator EatPlayerCoroutine(PlayerControllerB player, float eatTime)
			{
				//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
				return new <<EatPlayerClientRpc>g__EatPlayerCoroutine|120_0>d(0)
				{
					<>4__this = this,
					player = player,
					eatTime = eatTime
				};
			}
		}

		protected override void __initializeVariables()
		{
			if (targetPlayerId == null)
			{
				throw new Exception("SCP3166AI.targetPlayerId cannot be null. All NetworkVariableBase instances must be initialized.");
			}
			((NetworkVariableBase)targetPlayerId).Initialize((NetworkBehaviour)(object)this);
			((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)targetPlayerId, "targetPlayerId");
			((NetworkBehaviour)this).NetworkVariableFields.Add((NetworkVariableBase)(object)targetPlayerId);
			((EnemyAI)this).__initializeVariables();
		}

		protected override void __initializeRpcs()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Expected O, but got Unknown
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Expected O, but got Unknown
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Expected O, but got Unknown
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Expected O, but got Unknown
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Expected O, but got Unknown
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Expected O, but got Unknown
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Expected O, but got Unknown
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Expected O, but got Unknown
			((NetworkBehaviour)this).__registerRpc(1901319177u, new RpcReceiveHandler(__rpc_handler_1901319177), "DoAnimationServerRpc");
			((NetworkBehaviour)this).__registerRpc(1598392935u, new RpcReceiveHandler(__rpc_handler_1598392935), "DoAnimationClientRpc");
			((NetworkBehaviour)this).__registerRpc(1529781u, new RpcReceiveHandler(__rpc_handler_1529781), "PlayClipServerRpc");
			((NetworkBehaviour)this).__registerRpc(764069451u, new RpcReceiveHandler(__rpc_handler_764069451), "PlayClipClientRpc");
			((NetworkBehaviour)this).__registerRpc(2579341352u, new RpcReceiveHandler(__rpc_handler_2579341352), "SwitchToBehaviourClientRpc");
			((NetworkBehaviour)this).__registerRpc(3528172920u, new RpcReceiveHandler(__rpc_handler_3528172920), "FeedLasagnaServerRpc");
			((NetworkBehaviour)this).__registerRpc(3200112956u, new RpcReceiveHandler(__rpc_handler_3200112956), "FeedLasagnaClientRpc");
			((NetworkBehaviour)this).__registerRpc(646144598u, new RpcReceiveHandler(__rpc_handler_646144598), "EatPlayerClientRpc");
			((EnemyAI)this).__initializeRpcs();
		}

		private static void __rpc_handler_1901319177(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_002f: 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_0061: 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)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				bool flag = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives));
				string animName = null;
				if (flag)
				{
					((FastBufferReader)(ref reader)).ReadValueSafe(ref animName, false);
				}
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((SCP3166AI)(object)target).DoAnimationServerRpc(animName);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1598392935(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_002f: 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_0061: 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)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				bool flag = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives));
				string animName = null;
				if (flag)
				{
					((FastBufferReader)(ref reader)).ReadValueSafe(ref animName, false);
				}
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((SCP3166AI)(object)target).DoAnimationClientRpc(animName);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1529781(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_002f: 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_005b: 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_007a: 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_00ab: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				bool flag = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives));
				string clipName = null;
				if (flag)
				{
					((FastBufferReader)(ref reader)).ReadValueSafe(ref clipName, false);
				}
				int index = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref index);
				float pitch = default(float);
				((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref pitch, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((SCP3166AI)(object)target).PlayClipServerRpc(clipName, index, pitch);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_764069451(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_002f: 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_005b: 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_007a: 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_00ab: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				bool flag = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives));
				string clipName = null;
				if (flag)
				{
					((FastBufferReader)(ref reader)).ReadValueSafe(ref clipName, false);
				}
				int index = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref index);
				float pitch = default(float);
				((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref pitch, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((SCP3166AI)(object)target).PlayClipClientRpc(clipName, index, pitch);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_2579341352(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: 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_0050: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				int stateIndex = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref stateIndex);
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((SCP3166AI)(object)target).SwitchToBehaviourClientRpc(stateIndex);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_3528172920(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: 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)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((SCP3166AI)(object)target).FeedLasagnaServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_3200112956(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: 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)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((SCP3166AI)(object)target).FeedLasagnaClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_646144598(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: 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_0050: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				ulong clientId = default(ulong);
				ByteUnpacker.ReadValueBitPacked(reader, ref clientId);
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((SCP3166AI)(object)target).EatPlayerClientRpc(clientId);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		[MethodImpl(MethodImplOptions.NoInlining)]
		protected internal override string __getTypeName()
		{
			return "SCP3166AI";
		}
	}
	public class SCP3166ContentHandler : ContentHandler<SCP3166ContentHandler>
	{
		public class SCP3166Assets : AssetBundleLoader<SCP3166Assets>
		{
			public SCP3166Assets(DuskMod mod, string filePath)
				: base(mod, filePath)
			{
			}
		}

		public class LasagnaAssets : AssetBundleLoader<LasagnaAssets>
		{
			public LasagnaAssets(DuskMod mod, string filePath)
				: base(mod, filePath)
			{
			}
		}

		public class GarfieldPhoneAssets : AssetBundleLoader<GarfieldPhoneAssets>
		{
			public GarfieldPhoneAssets(DuskMod mod, string filePath)
				: base(mod, filePath)
			{
			}
		}

		public SCP3166Assets? SCP3166;

		public LasagnaAssets? Lasagna;

		public GarfieldPhoneAssets? GarfieldPhone;

		public SCP3166ContentHandler(DuskMod mod)
			: base(mod)
		{
			((ContentHandler)this).RegisterContent<SCP3166Assets>("scp3166", ref SCP3166, false);
			((ContentHandler)this).RegisterContent<LasagnaAssets>("lasagna", ref Lasagna, false);
			((ContentHandler)this).RegisterContent<GarfieldPhoneAssets>("garfieldphone", ref GarfieldPhone, false);
		}
	}
	public static class SCP3166Keys
	{
		public const string Namespace = "scpthreeonesixsix";

		internal static NamespacedKey LastVersion = NamespacedKey.From("scpthreeonesixsix", "last_version");

		public static readonly NamespacedKey<DawnEnemyInfo> SCP3166 = NamespacedKey<DawnEnemyInfo>.From("scpthreeonesixsix", "scpthreeonesixsix");

		public static readonly NamespacedKey<DawnItemInfo> GarfieldPhone = NamespacedKey<DawnItemInfo>.From("scpthreeonesixsix", "garfieldphone");

		public static readonly NamespacedKey<DawnItemInfo> Lasagna = NamespacedKey<DawnItemInfo>.From("scpthreeonesixsix", "lasagna");
	}
	[HarmonyPatch]
	public class TESTING : MonoBehaviour
	{
		[HarmonyPostfix]
		[HarmonyPatch(typeof(HUDManager), "PingScan_performed")]
		public static void PingScan_performedPostFix()
		{
			if (Utils.isBeta && Utils.testing)
			{
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(HUDManager), "SubmitChat_performed")]
		public static void SubmitChat_performedPrefix(HUDManager __instance)
		{
			if (Utils.isBeta && Plugin.IsServerOrHost)
			{
				string text = __instance.chatTextField.text;
				string[] array = text.Split(" ");
				Plugin.logger.LogDebug((object)text);
				string text2 = array[0];
				string text3 = text2;
				Utils.ChatCommand(array);
			}
		}
	}
	public class TestingHUDOverlay : MonoBehaviour
	{
		public static TestingHUDOverlay? Instance;

		public GameObject toggle1Obj;

		public Text toggle1Label;

		public Toggle toggle1;

		public GameObject toggle2Obj;

		public Text toggle2Label;

		public Toggle toggle2;

		public Text label1;

		public Text label2;

		public Text label3;

		public void Start()
		{
			if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this)
			{
				Object.Destroy((Object)(object)((Component)this).gameObject);
			}
			else
			{
				Instance = this;
			}
		}

		public void Update()
		{
			toggle1Obj.SetActive(toggle1Label.text != "");
			toggle2Obj.SetActive(toggle2Label.text != "");
		}
	}
	public static class Utils
	{
		public static bool isBeta;

		public static bool _testing;

		public static bool trailerMode;

		public static bool DEBUG_disableSpawning;

		public static bool DEBUG_disableTargetting;

		public static bool DEBUG_disableHostTargetting;

		public static bool DEBUG_disableMoving;

		public static bool localPlayerFrozen;

		public static bool testing => _testing && isBeta;

		public static bool inTestRoom => (Object)(object)StartOfRound.Instance?.testRoom != (Object)null;

		public static GameObject[] allAINodes => inTestRoom ? GameObject.FindGameObjectsWithTag("AINode") : insideAINodes.Concat(outsideAINodes).ToArray();

		public static GameObject[] insideAINodes
		{
			get
			{
				if (RoundManager.Instance.insideAINodes != null && RoundManager.Instance.insideAINodes.Length != 0)
				{
					return RoundManager.Instance.insideAINodes;
				}
				return GameObject.FindGameObjectsWithTag("AINode");
			}
		}

		public static GameObject[] outsideAINodes
		{
			get
			{
				if (RoundManager.Instance.outsideAINodes != null && RoundManager.Instance.outsideAINodes.Length != 0)
				{
					return RoundManager.Instance.outsideAINodes;
				}
				return GameObject.FindGameObjectsWithTag("OutsideAINode");
			}
		}

		public static void ChatCommand(string[] args)
		{
			switch (args[0])
			{
			case "/spawning":
				DEBUG_disableSpawning = !DEBUG_disableSpawning;
				HUDManager.Instance.DisplayTip("Disable Spawning", DEBUG_disableSpawning.ToString(), false, false, "LC_Tip1");
				break;
			case "/hazards":
			{
				Dictionary<string, GameObject> allHazards = GetAllHazards();
				{
					foreach (KeyValuePair<string, GameObject> item in allHazards)
					{
						Plugin.logger.LogDebug((object)item);
					}
					break;
				}
			}
			case "/testing":
				_testing = !_testing;
				HUDManager.Instance.DisplayTip("Testing", _testing.ToString(), false, false, "LC_Tip1");
				break;
			case "/surfaces":
			{
				FootstepSurface[] footstepSurfaces = StartOfRound.Instance.footstepSurfaces;
				foreach (FootstepSurface val3 in footstepSurfaces)
				{
					Plugin.logger.LogDebug((object)val3.surfaceTag);
				}
				break;
			}
			case "/enemies":
			{
				foreach (SpawnableEnemyWithRarity enemy in GetEnemies())
				{
					Plugin.logger.LogDebug((object)((Object)enemy.enemyType).name);
				}
				break;
			}
			case "/refresh":
				RoundManager.Instance.RefreshEnemiesList();
				HoarderBugAI.RefreshGrabbableObjectsInMapList();
				break;
			case "/levels":
			{
				SelectableLevel[] levels = StartOfRound.Instance.levels;
				foreach (SelectableLevel val2 in levels)
				{
					Plugin.logger.LogDebug((object)((Object)val2).name);
				}
				break;
			}
			case "/dungeon":
				Plugin.logger.LogDebug((object)((Object)RoundManager.Instance.dungeonGenerator.Generator.DungeonFlow).name);
				break;
			case "/dungeons":
			{
				IndoorMapType[] dungeonFlowTypes = RoundManager.Instance.dungeonFlowTypes;
				foreach (IndoorMapType val in dungeonFlowTypes)
				{
					Plugin.logger.LogDebug((object)((Object)val.dungeonFlow).name);
				}
				break;
			}
			case "/time":
				RoundManager.Instance.currentLevel.planetHasTime = !RoundManager.Instance.currentLevel.planetHasTime;
				HUDManager.Instance.DisplayTip("planetHasTime", RoundManager.Instance.currentLevel.planetHasTime.ToString(), false, false, "LC_Tip1");
				break;
			}
		}

		public static void LogChat(string msg)
		{
			HUDManager.Instance.AddChatMessage(msg, "Server", -1, false);
		}

		public static Transform? GetClosestAINodeToPosition(Vector3 pos)
		{
			//IL_002b: 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)
			Transform result = null;
			float num = float.PositiveInfinity;
			GameObject[] array = allAINodes;
			foreach (GameObject val in array)
			{
				if (!((Object)(object)val == (Object)null))
				{
					float num2 = Vector3.Distance(pos, val.transform.position);
					if (!(num2 > num))
					{
						num = num2;
						result = val.transform;
					}
				}
			}
			return result;
		}

		public static Vector3 GetBestThrowDirection(Vector3 origin, Vector3 forward, int rayCount, float maxDistance, LayerMask layerMask)
		{
			//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_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_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_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)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: 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_00a2: 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_008b: 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_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			Vector3 result = forward;
			float num = 0f;
			RaycastHit val2 = default(RaycastHit);
			for (int i = 0; i < rayCount; i++)
			{
				float num2 = (float)i * (360f / (float)rayCount);
				Vector3 val = Quaternion.Euler(0f, num2, 0f) * ((Vector3)(ref forward)).normalized;
				if (Physics.Raycast(origin + Vector3.up * 0.5f, val, ref val2, maxDistance, LayerMask.op_Implicit(layerMask)))
				{
					if (((RaycastHit)(ref val2)).distance > num)
					{
						result = val;
						num = ((RaycastHit)(ref val2)).distance;
					}
					continue;
				}
				return val;
			}
			return result;
		}

		public static Vector3 GetSpeed()
		{
			//IL_022b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0255: Unknown result type (might be due to invalid IL or missing references)
			//IL_0260: Unknown result type (might be due to invalid IL or missing references)
			//IL_0277: 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_0286: 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_0295: Unknown result type (might be due to invalid IL or missing references)
			//IL_029a: Unknown result type (might be due to invalid IL or missing references)
			//IL_029f: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bc: 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_03e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_03f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_040c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0411: Unknown result type (might be due to invalid IL or missing references)
			//IL_0416: Unknown result type (might be due to invalid IL or missing references)
			//IL_0417: Unknown result type (might be due to invalid IL or missing references)
			//IL_041c: Unknown result type (might be due to invalid IL or missing references)
			//IL_041e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0425: Unknown result type (might be due to invalid IL or missing references)
			//IL_042a: Unknown result type (might be due to invalid IL or missing references)
			//IL_042f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0431: Unknown result type (might be due to invalid IL or missing references)
			//IL_0433: Unknown result type (might be due to invalid IL or missing references)
			//IL_0437: Unknown result type (might be due to invalid IL or missing references)
			//IL_036c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0377: Unknown result type (might be due to invalid IL or missing references)
			//IL_038e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0393: 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_03b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_03bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_032e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0345: 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_0162: Unknown result type (might be due to invalid IL or missing references)
			float num = Plugin.localPlayer.movementSpeed / Plugin.localPlayer.carryWeight;
			if (Plugin.localPlayer.sinkingValue > 0.73f)
			{
				num = 0f;
			}
			else
			{
				if (Plugin.localPlayer.isCrouching)
				{
					num /= 1.5f;
				}
				else if (Plugin.localPlayer.criticallyInjured && !Plugin.localPlayer.isCrouching)
				{
					num *= Plugin.localPlayer.limpMultiplier;
				}
				if (Plugin.localPlayer.isSpeedCheating)
				{
					num *= 15f;
				}
				if (Plugin.localPlayer.movementHinderedPrev > 0)
				{
					num /= 2f * Plugin.localPlayer.hinderedMultiplier;
				}
				if (Plugin.localPlayer.drunkness > 0f)
				{
					num *= StartOfRound.Instance.drunknessSpeedEffect.Evaluate(Plugin.localPlayer.drunkness) / 5f + 1f;
				}
				if (!Plugin.localPlayer.isCrouching && Plugin.localPlayer.crouchMeter > 1.2f)
				{
					num *= 0.5f;
				}
				if (!Plugin.localPlayer.isCrouching)
				{
					float num2 = Vector3.Dot(Plugin.localPlayer.playerGroundNormal, Plugin.localPlayer.walkForce);
					if (num2 > 0.05f)
					{
						Plugin.localPlayer.slopeModifier = Mathf.MoveTowards(Plugin.localPlayer.slopeModifier, num2, (Plugin.localPlayer.slopeModifierSpeed + 0.45f) * Time.deltaTime);
					}
					else
					{
						Plugin.localPlayer.slopeModifier = Mathf.MoveTowards(Plugin.localPlayer.slopeModifier, num2, Plugin.localPlayer.slopeModifierSpeed / 2f * Time.deltaTime);
					}
					num = Mathf.Max(num * 0.8f, num + Plugin.localPlayer.slopeIntensity * Plugin.localPlayer.slopeModifier);
				}
			}
			Vector3 val = default(Vector3);
			((Vector3)(ref val))..ctor(0f, 0f, 0f);
			int num3 = Physics.OverlapSphereNonAlloc(((Component)Plugin.localPlayer).transform.position, 0.65f, Plugin.localPlayer.nearByPlayers, StartOfRound.Instance.playersMask);
			for (int i = 0; i < num3; i++)
			{
				val += Vector3.Normalize((((Component)Plugin.localPlayer).transform.position - ((Component)Plugin.localPlayer.nearByPlayers[i]).transform.position) * 100f) * 1.2f;
			}
			int num4 = Physics.OverlapSphereNonAlloc(((Component)Plugin.localPlayer).transform.position, 1.25f, Plugin.localPlayer.nearByPlayers, 524288);
			for (int j = 0; j < num4; j++)
			{
				EnemyAICollisionDetect component = ((Component)Plugin.localPlayer.nearByPlayers[j]).gameObject.GetComponent<EnemyAICollisionDetect>();
				if ((Object)(object)component != (Object)null && (Object)(object)component.mainScript != (Object)null && !component.mainScript.isEnemyDead && Vector3.Distance(((Component)Plugin.localPlayer).transform.position, ((Component)Plugin.localPlayer.nearByPlayers[j]).transform.position) < component.mainScript.enemyType.pushPlayerDistance)
				{
					val += Vector3.Normalize((((Component)Plugin.localPlayer).transform.position - ((Component)Plugin.localPlayer.nearByPlayers[j]).transform.position) * 100f) * component.mainScript.enemyType.pushPlayerForce;
				}
			}
			Vector3 val2 = Plugin.localPlayer.walkForce * num * Plugin.localPlayer.sprintMultiplier + new Vector3(0f, Plugin.localPlayer.fallValue, 0f) + val;
			return val2 + Plugin.localPlayer.externalForces;
		}

		public static void FreezePlayer(PlayerControllerB player, bool value)
		{
			localPlayerFrozen = value;
			player.disableInteract = value;
			player.disableLookInput = value;
			player.disableMoveInput = value;
		}

		public static void DespawnItemInSlotOnClient(int itemSlot)
		{
			((Behaviour)HUDManager.Instance.itemSlotIcons[itemSlot]).enabled = false;
			Plugin.localPlayer.DestroyItemInSlotAndSync(itemSlot);
		}

		public static void MakePlayerInvisible(PlayerControllerB player, bool value)
		{
			GameObject gameObject = ((Component)((Component)player).gameObject.transform.Find("ScavengerModel")).gameObject;
			if ((Object)(object)gameObject == (Object)null)
			{
				Plugin.logger.LogError((object)"ScavengerModel not found");
				return;
			}
			((Component)gameObject.transform.Find("LOD1")).gameObject.SetActive(!value);
			((Component)gameObject.transform.Find("LOD2")).gameObject.SetActive(!value);
			((Component)gameObject.transform.Find("LOD3")).gameObject.SetActive(!value);
			((Component)gameObject.transform.Find("metarig/spine/spine.001/spine.002/spine.003/LevelSticker")).gameObject.SetActive(!value);
			((Component)gameObject.transform.Find("metarig/spine/spine.001/spine.002/spine.003/BetaBadge")).gameObject.SetActive(!value);
			((Component)player.playerBadgeMesh).gameObject.SetActive(!value);
		}

		public static List<SpawnableEnemyWithRarity> GetEnemies()
		{
			List<SpawnableEnemyWithRarity> list = new List<SpawnableEnemyWithRarity>();
			return (from x in GameObject.Find("Terminal").GetComponentInChildren<Terminal>().moonsCatalogueList.SelectMany((SelectableLevel x) => x.Enemies.Concat(x.DaytimeEnemies).Concat(x.OutsideEnemies))
				where x != null && (Object)(object)x.enemyType != (Object)null && ((Object)x.enemyType).name != null
				select x).GroupBy((SpawnableEnemyWithRarity x) => ((Object)x.enemyType).name, (string k, IEnumerable<SpawnableEnemyWithRarity> v) => v.First()).ToList();
		}

		public static EnemyVent GetClosestVentToPosition(Vector3 pos)
		{
			//IL_001f: 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)
			float num = 2000f;
			EnemyVent result = null;
			EnemyVent[] allEnemyVents = RoundManager.Instance.allEnemyVents;
			foreach (EnemyVent val in allEnemyVents)
			{
				float num2 = Vector3.Distance(pos, ((Component)val.floorNode).transform.position);
				if (num2 < num)
				{
					num = num2;
					result = val;
				}
			}
			return result;
		}

		public static bool CalculatePath(Vector3 fromPos, Vector3 toPos)
		{
			//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_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_0022: 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_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_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Expected O, but got Unknown
			//IL_003f: 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_005a: 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_006a: 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)
			Vector3 navMeshPosition = RoundManager.Instance.GetNavMeshPosition(fromPos, RoundManager.Instance.navHit, 1.75f, -1);
			Vector3 navMeshPosition2 = RoundManager.Instance.GetNavMeshPosition(toPos, RoundManager.Instance.navHit, 1.75f, -1);
			NavMeshPath val = new NavMeshPath();
			return NavMesh.CalculatePath(navMeshPosition, navMeshPosition2, -1, val) && Vector3.Distance(val.corners[val.corners.Length - 1], RoundManager.Instance.GetNavMeshPosition(navMeshPosition2, RoundManager.Instance.navHit, 2.7f, -1)) <= 1.55f;
		}

		public static bool CalculatePath(Vector3 fromPos, Vector3 toPos, Vector3 mainEntranceInsidePosition, Vector3 mainEntranceOutsidePosition, bool isOutside)
		{
			//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_0017: 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_0018: 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_001d: 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_0022: 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_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)
			if (!CalculatePath(fromPos, toPos))
			{
				Vector3 toPos2 = (isOutside ? mainEntranceOutsidePosition : mainEntranceInsidePosition);
				Vector3 fromPos2 = (isOutside ? mainEntranceInsidePosition : mainEntranceOutsidePosition);
				return CalculatePath(fromPos, toPos2) && CalculatePath(fromPos2, toPos);
			}
			return true;
		}

		public static T? GetClosestGameObjectOfType<T>(Vector3 position) where T : Component
		{
			//IL_0028: 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)
			T[] array = Object.FindObjectsOfType<T>();
			T result = default(T);
			float num = float.PositiveInfinity;
			T[] array2 = array;
			foreach (T val in array2)
			{
				float num2 = Vector3.Distance(position, ((Component)val).transform.position);
				if (num2 < num)
				{
					num = num2;
					result = val;
				}
			}
			return result;
		}

		public static void Shuffle<T>(this List<T> list)
		{
			int num = list.Count;
			while (num > 1)
			{
				num--;
				int index = Random.Range(0, num + 1);
				T value = list[index];
				list[index] = list[num];
				list[num] = value;
			}
		}

		public static T? GetClosestToPosition<T>(this IEnumerable<T> list, Vector3 position, Func<T, Vector3> positionSelector) where T : class
		{
			//IL_0032: 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)
			T result = null;
			float num = float.PositiveInfinity;
			foreach (T item in list)
			{
				if (item != null)
				{
					float num2 = Vector3.Distance(position, positionSelector(item));
					if (!(num2 >= num))
					{
						result = item;
						num = num2;
					}
				}
			}
			return result;
		}

		public static T? GetFarthestFromPosition<T>(this IEnumerable<T> list, Vector3 position, Func<T, Vector3> positionSelector) where T : class
		{
			//IL_0032: 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)
			T result = null;
			float num = 0f;
			foreach (T item in list)
			{
				if (item != null)
				{
					float num2 = Vector3.Distance(position, positionSelector(item));
					if (!(num2 <= num))
					{
						result = item;
						num = num2;
					}
				}
			}
			return result;
		}

		public static Dictionary<string, GameObject> GetAllHazards()
		{
			Dictionary<string, GameObject> dictionary = new Dictionary<string, GameObject>();
			List<SpawnableMapObject> list = (from x in StartOfRound.Instance.levels.SelectMany((SelectableLevel level) => level.spawnableMapObjects)
				group x by ((Object)x.prefabToSpawn).name into g
				select g.First()).ToList();
			foreach (SpawnableMapObject item in list)
			{
				dictionary.Add(((Object)item.prefabToSpawn).name, item.prefabToSpawn);
			}
			return dictionary;
		}

		public static GameObject? GetRandomNode(bool outside, GameObject[]? excludedNodes = null)
		{
			Plugin.logger.LogDebug((object)"Choosing random node...");
			if (excludedNodes == null)
			{
				excludedNodes = Array.Empty<GameObject>();
			}
			GameObject[] first = (outside ? outsideAINodes : insideAINodes);
			first = first.Except(excludedNodes).ToArray();
			if (first.Length == 0)
			{
				return null;
			}
			int num = Random.Range(0, first.Length);
			return first[num];
		}

		public static GameObject? GetRandomNode(GameObject[]? excludedNodes = null)
		{
			Plugin.logger.LogDebug((object)"Choosing random node...");
			if (excludedNodes == null)
			{
				excludedNodes = Array.Empty<GameObject>();
			}
			GameObject[] array = allAINodes.Except(excludedNodes).ToArray();
			if (array.Length == 0)
			{
				return null;
			}
			int num = Random.Range(0, array.Length);
			return array[num];
		}

		public static Vector3 GetRandomNavMeshPositionInAnnulus(Vector3 center, float minRadius, float maxRadius, int sampleCount = 10)
		{
			//IL_0001: 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_00b2: 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_0054: Unknow