Decompiled source of TheCabinet v1.7.0

plugins/TheCabinet/VectorV.TheCabinet.dll

Decompiled 4 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.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.AI;
using VectorV.TheCabinet.NetcodePatcher;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("VectorV.TheCabinet")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.7.0.0")]
[assembly: AssemblyInformationalVersion("1.7.0")]
[assembly: AssemblyProduct("TheCabinet")]
[assembly: AssemblyTitle("VectorV.TheCabinet")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.7.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
[module: NetcodePatchedAssembly]
internal class <Module>
{
	static <Module>()
	{
	}
}
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

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

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

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

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace TheCabinet
{
	internal class AnimationEventHandler : MonoBehaviour
	{
		[SerializeField]
		private TheCabinetAI mainScript;

		[SerializeField]
		private BloodSpawner bloodSpawner;

		public void ToggleVulnerability(int toggle)
		{
			mainScript.IsVulnerable = toggle > 0;
		}

		public void ToggleHide(int toggle)
		{
			mainScript.IsHidden = toggle > 0;
			if (toggle > 0)
			{
				mainScript.DoAnimationClientRpc("EmergeMultiplier", (AnimatorControllerParameterType)1, -1f);
			}
		}

		public void StartMoving()
		{
			if (((NetworkBehaviour)mainScript).IsOwner)
			{
				((EnemyAI)mainScript).agent.isStopped = false;
			}
		}

		public void StopMoving()
		{
			if (((NetworkBehaviour)mainScript).IsOwner)
			{
				((EnemyAI)mainScript).agent.isStopped = true;
			}
		}

		public void DeadBody()
		{
			mainScript.EatBody();
		}

		public void Blood()
		{
			bloodSpawner.PlayBloodParticles();
		}

		public void PlayAudio(string audio)
		{
			if (audio == "reveal")
			{
				if (((EnemyAI)mainScript).creatureAnimator.GetFloat("EmergeMultiplier") < 0f)
				{
					mainScript.PlayAudio("hideQuick");
				}
				else
				{
					mainScript.PlayAudio(audio);
				}
			}
			else
			{
				mainScript.PlayAudio(audio);
			}
		}
	}
	internal class BloodSpawner : MonoBehaviour
	{
		private ParticleSystem bloodParticle;

		[SerializeField]
		private GameObject bloodDecal;

		private List<ParticleCollisionEvent> bloodCollisionEvents = new List<ParticleCollisionEvent>();

		private List<GameObject> decalsList;

		private void Start()
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			bloodParticle = ((Component)this).GetComponent<ParticleSystem>();
			decalsList = new List<GameObject>();
			EmissionModule emission = bloodParticle.emission;
			((EmissionModule)(ref emission)).rateOverTime = MinMaxCurve.op_Implicit((float)PluginConfig.ParticlesAmount.Value / bloodParticle.duration);
		}

		public void PlayBloodParticles()
		{
			bloodParticle.Play();
		}

		private void OnParticleCollision(GameObject other)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			int collisionEvents = ParticlePhysicsExtensions.GetCollisionEvents(bloodParticle, other, bloodCollisionEvents);
			for (int i = 0; i < collisionEvents; i++)
			{
				ParticleCollisionEvent val = bloodCollisionEvents[i];
				Vector3 intersection = ((ParticleCollisionEvent)(ref val)).intersection;
				val = bloodCollisionEvents[i];
				Vector3 normal = ((ParticleCollisionEvent)(ref val)).normal;
				if (PluginConfig.DecalsEnabled.Value)
				{
					SpawnBloodDecal(intersection, normal);
				}
			}
		}

		private void SpawnBloodDecal(Vector3 position, Vector3 normal)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			Quaternion val = Quaternion.LookRotation(normal);
			GameObject val2 = Object.Instantiate<GameObject>(bloodDecal, position, val);
			val2.transform.Rotate(180f, 0f, Random.Range(0f, 360f));
			Transform transform = val2.transform;
			transform.localScale *= Random.Range(0.25f, 1.5f);
			decalsList.Add(val2);
		}

		private void OnDestroy()
		{
			for (int num = decalsList.Count - 1; num >= 0; num--)
			{
				Object.Destroy((Object)(object)decalsList[num]);
			}
		}
	}
	public abstract class CabinetState : IState
	{
		protected TheCabinetAI owner;

		protected Transform transform => ((Component)owner).transform;

		protected Vector3 position => transform.position;

		protected NavMeshAgent agent => ((EnemyAI)owner).agent;

		protected abstract float stateSpeed { get; }

		protected CabinetState(TheCabinetAI owner)
		{
			this.owner = owner;
		}

		public abstract void Enter();

		public abstract void Execute();

		public abstract void ExecuteSlow();

		public abstract void Exit();
	}
	internal class CabinetState_Following : CabinetState
	{
		private float stoppingDistance = 4f;

		private float distanceToGetUp = 5f;

		private float warningDuration = PluginConfig.WarningDuration.Value;

		private float warningMultiplier = 0.2f;

		private float closeDistance = 5f;

		private float tooFarDistance = 20f;

		private float isGettingMad = -1f;

		private bool newLook = true;

		private int lookAmount;

		private bool isWaiting;

		private Vector3 followedPlayerLastPosition;

		protected override float stateSpeed => 5f;

		private bool isHidden => owner.IsHidden;

		private bool lookedAt => owner.IsLookedAt();

		public CabinetState_Following(TheCabinetAI owner)
			: base(owner)
		{
		}

		public override void Enter()
		{
			((EnemyAI)owner).SwitchToBehaviourStateOnLocalClient(1);
			base.agent.speed = stateSpeed;
			base.agent.stoppingDistance = stoppingDistance;
			newLook = true;
			lookAmount = 0;
			if (((NetworkBehaviour)owner).IsOwner)
			{
				((EnemyAI)owner).SetMovingTowardsTargetPlayer(((EnemyAI)owner).targetPlayer);
			}
		}

		public override void Execute()
		{
			if (!((NetworkBehaviour)owner).IsOwner)
			{
				return;
			}
			if (isGettingMad >= 0f)
			{
				if (lookedAt)
				{
					if (newLook)
					{
						newLook = false;
						lookAmount++;
					}
					isGettingMad += Time.deltaTime * (1f + (float)(lookAmount - 1) * warningMultiplier);
					if (isGettingMad >= warningDuration)
					{
						for (int i = 0; i < owner.LookingPlayers.Length; i++)
						{
							if (owner.LookingPlayers[i])
							{
								owner.PlayersToKill.Add(owner.PlayersScripts[i]);
							}
						}
						owner.ChangeStateServerRpc(State.Killing);
					}
				}
				else
				{
					newLook = true;
					isGettingMad -= Time.deltaTime;
					if (isGettingMad <= 0f)
					{
						isGettingMad = -1f;
						owner.DoAnimationClientRpc("Warning", (AnimatorControllerParameterType)4, 0f);
						base.agent.isStopped = false;
					}
				}
			}
			else if (isHidden && lookedAt && ((EnemyAI)owner).creatureAnimator.GetFloat("EmergeMultiplier") > 0f)
			{
				owner.DoAnimationClientRpc("EmergeMultiplier", (AnimatorControllerParameterType)1, -1f);
				((EnemyAI)owner).creatureSFX.Stop();
			}
			else if (!isHidden && lookedAt)
			{
				if (isGettingMad < 0f)
				{
					isGettingMad = 0f;
				}
				owner.DoAnimationClientRpc("Warning", (AnimatorControllerParameterType)4);
			}
			if (isGettingMad >= 0f)
			{
				owner.SetWarningGaugeClientRpc(Mathf.Clamp(isGettingMad / warningDuration, 0f, 1f));
			}
			if (owner.IsHidden)
			{
				lookAmount = 0;
			}
		}

		public override void ExecuteSlow()
		{
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			if (isGettingMad >= 0f)
			{
				return;
			}
			if (((EnemyAI)owner).targetPlayer.isInsideFactory)
			{
				isWaiting = false;
				if (((EnemyAI)owner).targetPlayer.isPlayerDead)
				{
					PlayerControllerB val = TryGetClosePlayer();
					if ((Object)(object)val != (Object)null)
					{
						((EnemyAI)owner).SetMovingTowardsTargetPlayer(val);
					}
					else
					{
						owner.ChangeStateServerRpc(State.Wandering);
					}
				}
				else if (Vector3.Distance(((Component)((EnemyAI)owner).targetPlayer).transform.position, base.transform.position) > tooFarDistance)
				{
					PlayerControllerB val2 = TryGetClosePlayer();
					if ((Object)(object)val2 != (Object)null)
					{
						((EnemyAI)owner).SetMovingTowardsTargetPlayer(val2);
					}
				}
			}
			else
			{
				PlayerControllerB val3 = TryGetClosePlayer();
				if ((Object)(object)val3 != (Object)null)
				{
					((EnemyAI)owner).SetMovingTowardsTargetPlayer(val3);
				}
				else
				{
					isWaiting = true;
				}
			}
			if (owner.IsHidden && !lookedAt && !IsFollowedPlayerClose() && !isWaiting && ((EnemyAI)owner).creatureAnimator.GetFloat("EmergeMultiplier") < 0f)
			{
				owner.DoAnimationClientRpc("EmergeMultiplier", (AnimatorControllerParameterType)1);
				owner.DoAnimationClientRpc("Hide", (AnimatorControllerParameterType)4, 0f);
			}
			else if (!base.agent.isStopped && ((IsFollowedPlayerClose() && !IsFollowedPlayerMoving()) || isWaiting))
			{
				base.agent.isStopped = true;
				owner.DoAnimationClientRpc("Hide", (AnimatorControllerParameterType)4);
			}
		}

		public override void Exit()
		{
		}

		private PlayerControllerB TryGetClosePlayer()
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: 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)
			PlayerControllerB result = null;
			float num = float.MaxValue;
			Vector3 val = default(Vector3);
			((Vector3)(ref val))..ctor(base.position.x, 0f, base.position.z);
			PlayerControllerB[] playersScripts = owner.PlayersScripts;
			Vector3 val4 = default(Vector3);
			foreach (PlayerControllerB val2 in playersScripts)
			{
				if (!val2.isPlayerDead)
				{
					Vector3 val3 = ((Component)val2).transform.position;
					((Vector3)(ref val4))..ctor(val3.x, 0f, val3.z);
					float num2 = Vector3.Distance(val4, val);
					if (num2 < num && num2 <= closeDistance && owner.HasLineOfSight(val2))
					{
						result = val2;
						num = num2;
					}
				}
			}
			return result;
		}

		private bool IsFollowedPlayerClose()
		{
			//IL_0012: 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)
			PlayerControllerB targetPlayer = ((EnemyAI)owner).targetPlayer;
			if (Vector3.Distance(((Component)targetPlayer).transform.position, base.position) < distanceToGetUp)
			{
				return true;
			}
			return false;
		}

		private bool IsFollowedPlayerMoving()
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: 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_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			PlayerControllerB targetPlayer = ((EnemyAI)owner).targetPlayer;
			Vector3 val = ((Component)targetPlayer).transform.position;
			float num = Vector3.Distance(val, followedPlayerLastPosition);
			followedPlayerLastPosition = val;
			if (num > 0.1f)
			{
				return true;
			}
			return false;
		}
	}
	internal class CabinetState_Killing : CabinetState
	{
		private bool isLocalPlayerKillable;

		private float delay = -1f;

		protected override float stateSpeed => PluginConfig.KillingStateSpeed.Value;

		public CabinetState_Killing(TheCabinetAI owner)
			: base(owner)
		{
		}

		public override void Enter()
		{
			((EnemyAI)owner).SwitchToBehaviourStateOnLocalClient(2);
			base.agent.speed = stateSpeed;
			base.agent.stoppingDistance = 0f;
			((EnemyAI)owner).creatureAnimator.SetBool("Angry", true);
			owner.ToggleHandStepsSettings(angry: true);
			if (((NetworkBehaviour)owner).IsOwner)
			{
				SetTarget(GetNextTarget(safeMode: true));
			}
			if (PluginConfig.DropItemsWhenAngry.Value)
			{
				owner.DropItemsClientRpc();
			}
		}

		public override void Execute()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			if (delay <= 0f)
			{
				delay = 0.25f;
				AnimatorStateInfo currentAnimatorStateInfo = ((EnemyAI)owner).creatureAnimator.GetCurrentAnimatorStateInfo(0);
				if (((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("Chase"))
				{
					isLocalPlayerKillable = owner.IsLocalPlayerAttackable();
				}
				if (isLocalPlayerKillable)
				{
					owner.NotifyKillableServerRpc(Array.IndexOf(owner.PlayersScripts, owner.LocalPlayer), isLocalPlayerKillable);
				}
			}
			else
			{
				delay -= Time.deltaTime;
			}
		}

		public override void ExecuteSlow()
		{
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)((EnemyAI)owner).targetPlayer != (Object)null)
			{
				if (((EnemyAI)owner).targetPlayer.isPlayerDead && !base.agent.isStopped)
				{
					SetTarget(GetNextTarget());
				}
				else if ((int)owner.GetPath(((Component)((EnemyAI)owner).targetPlayer).transform.position).status != 0)
				{
					if (!((EnemyAI)owner).targetPlayer.isInsideFactory && !((EnemyAI)owner).isOutside)
					{
						SetTarget(GetNextTarget());
					}
					else if (((EnemyAI)owner).targetPlayer.isInsideFactory && ((EnemyAI)owner).isOutside)
					{
						SetTarget(GetNextTarget());
					}
				}
			}
			owner.ApplyFearToPlayers();
			if (!base.agent.isStopped)
			{
				TryToKill();
			}
		}

		public override void Exit()
		{
			owner.PlayersToKill.Clear();
			owner.DoAnimationClientRpc("Angry", (AnimatorControllerParameterType)4, 0f);
			owner.DoAnimationClientRpc("Warning", (AnimatorControllerParameterType)4, 0f);
			owner.ToggleHandStepsSettings(angry: false);
		}

		private void SetTarget(PlayerControllerB player)
		{
			((EnemyAI)owner).SetMovingTowardsTargetPlayer(player);
			if ((Object)(object)player == (Object)null)
			{
				((MonoBehaviour)owner).StartCoroutine(owner.DelayedExecution(owner.ChangeStateServerRpc, State.Wandering, 1f));
			}
		}

		private PlayerControllerB GetNextTarget(bool safeMode = false)
		{
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Expected O, but got Unknown
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			PlayerControllerB val = null;
			float num = float.MaxValue;
			NavMeshHit val2 = default(NavMeshHit);
			for (int i = 0; i < owner.PlayersToKill.Count; i++)
			{
				if (owner.PlayersToKill[i].isPlayerDead || !owner.PlayersToKill[i].isInsideFactory)
				{
					continue;
				}
				NavMesh.SamplePosition(((Component)owner.PlayersToKill[i]).transform.position, ref val2, 1f, base.agent.areaMask);
				NavMeshPath val3 = new NavMeshPath();
				NavMesh.CalculatePath(base.position, ((NavMeshHit)(ref val2)).position, base.agent.areaMask, val3);
				if ((int)val3.status == 0)
				{
					float num2 = Vector3.Distance(base.position, val3.corners[0]);
					for (int j = 1; j < val3.corners.Length; j++)
					{
						num2 += Vector3.Distance(val3.corners[j - 1], val3.corners[j]);
					}
					if (num2 < num)
					{
						num = num2;
						val = owner.PlayersToKill[i];
					}
				}
			}
			if (safeMode && (Object)(object)val == (Object)null)
			{
				return owner.PlayersToKill[0];
			}
			return val;
		}

		private void TryToKill()
		{
			for (int i = 0; i < owner.PlayersToKill.Count; i++)
			{
				int num = Array.IndexOf(owner.PlayersScripts, owner.PlayersToKill[i]);
				if (owner.KillablePlayers[num])
				{
					Plugin.Logger.LogDebug((object)$"Player n°{num} is in range !");
					owner.KillablePlayers[num] = false;
					KillPlayer(owner.PlayersToKill[i]);
					break;
				}
			}
		}

		private void KillPlayer(PlayerControllerB player)
		{
			Plugin.Logger.LogDebug((object)"Executing kill !");
			base.agent.isStopped = true;
			owner.PlayersToKill.Remove(player);
			owner.DoAnimationClientRpc("Kill", (AnimatorControllerParameterType)9);
			owner.KillLocalPlayerClientRpc(Array.IndexOf(owner.PlayersScripts, player));
			SetTarget(GetNextTarget());
		}
	}
	internal class CabinetState_Wandering : CabinetState
	{
		private float minDistanceToNextDestination = 20f;

		private float waitTimeBetweenDestinations = 3f;

		private float lookDuration = 2f;

		private float proximityRadius = 40f;

		private float clearRadius = 50f;

		private Coroutine? coroutine;

		private bool isHiding;

		protected override float stateSpeed => 2f;

		public CabinetState_Wandering(TheCabinetAI owner)
			: base(owner)
		{
		}

		public override void Enter()
		{
			((EnemyAI)owner).SwitchToBehaviourStateOnLocalClient(0);
			base.agent.speed = stateSpeed;
			base.agent.stoppingDistance = 0f;
			((EnemyAI)owner).targetPlayer = null;
			if (((NetworkBehaviour)owner).IsOwner)
			{
				FindNextDestination();
			}
		}

		public override void Execute()
		{
		}

		public override void ExecuteSlow()
		{
			//IL_00e1: 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_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			for (int i = 0; i < owner.LookingPlayers.Length; i++)
			{
				if (owner.LookingPlayers[i] && Time.time - owner.LookingPlayersTime[i] >= lookDuration)
				{
					((EnemyAI)owner).targetPlayer = owner.PlayersScripts[i];
					owner.ChangeStateServerRpc(State.Following);
				}
			}
			if (isHiding)
			{
				if (!CheckForNearbyPlayer(clearRadius))
				{
					isHiding = false;
					owner.DoAnimationClientRpc("Hide", (AnimatorControllerParameterType)4, 0f);
				}
			}
			else if (CheckForNearbyPlayer(proximityRadius))
			{
				base.agent.isStopped = true;
				isHiding = true;
				owner.DoAnimationClientRpc("Hide", (AnimatorControllerParameterType)4);
			}
			else if (coroutine == null)
			{
				if (Vector3.Distance(base.position, ((EnemyAI)owner).destination) <= 1f)
				{
					coroutine = ((MonoBehaviour)owner).StartCoroutine(WaitBeforeNewDestination());
				}
				else if ((int)owner.GetPath(((EnemyAI)owner).destination).status != 0)
				{
					Plugin.Logger.LogInfo((object)"Destination is no longer reachable, getting a new one...");
					coroutine = ((MonoBehaviour)owner).StartCoroutine(WaitBeforeNewDestination());
				}
				else
				{
					base.agent.isStopped = false;
				}
			}
		}

		public override void Exit()
		{
			if (coroutine != null)
			{
				((MonoBehaviour)owner).StopCoroutine(coroutine);
			}
		}

		private void FindNextDestination()
		{
			//IL_0035: 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_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			List<GameObject> list = ((EnemyAI)owner).allAINodes.ToList();
			if (list.Count == 0)
			{
				Plugin.Logger.LogError((object)"No AI nodes found !");
				return;
			}
			for (int num = list.Count - 1; num >= 0; num--)
			{
				if (Vector3.Distance(base.position, list[num].transform.position) < minDistanceToNextDestination || (int)owner.GetPath(list[num].transform.position).status != 0)
				{
					list.RemoveAt(num);
				}
			}
			if (list.Count == 0)
			{
				list = ((EnemyAI)owner).allAINodes.ToList();
			}
			((EnemyAI)owner).SetDestinationToPosition(list[Random.Range(0, list.Count)].transform.position, false);
		}

		private IEnumerator WaitBeforeNewDestination()
		{
			((EnemyAI)owner).moveTowardsDestination = false;
			yield return (object)new WaitForSeconds(waitTimeBetweenDestinations);
			FindNextDestination();
		}

		private bool CheckForNearbyPlayer(float distance)
		{
			//IL_0003: 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_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = default(Vector3);
			((Vector3)(ref val))..ctor(base.position.x, 0f, base.position.z);
			PlayerControllerB[] playersScripts = owner.PlayersScripts;
			Vector3 val4 = default(Vector3);
			foreach (PlayerControllerB val2 in playersScripts)
			{
				Vector3 val3 = ((Component)val2).transform.position;
				((Vector3)(ref val4))..ctor(val3.x, 0f, val3.z);
				if (Vector3.Distance(val4, val) <= distance)
				{
					return true;
				}
			}
			return false;
		}
	}
	public interface IState
	{
		void Enter();

		void Execute();

		void ExecuteSlow();

		void Exit();
	}
	[BepInPlugin("VectorV.TheCabinet", "TheCabinet", "1.7.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		internal static ManualLogSource Logger;

		public static AssetBundle? ModAssets;

		internal static PluginConfig BoundConfig { get; private set; }

		private void Awake()
		{
			Logger = ((BaseUnityPlugin)this).Logger;
			BoundConfig = new PluginConfig(((BaseUnityPlugin)this).Config);
			InitializeNetworkBehaviours();
			string path = "cabinetassets";
			ModAssets = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), path));
			if ((Object)(object)ModAssets == (Object)null)
			{
				Logger.LogError((object)"Failed to load custom assets.");
				return;
			}
			EnemyType val = ModAssets.LoadAsset<EnemyType>("TheCabinet");
			TerminalNode terminalNode = ModAssets.LoadAsset<TerminalNode>("TheCabinetTN");
			TerminalKeyword terminalKeyword = ModAssets.LoadAsset<TerminalKeyword>("TheCabinetTK");
			NetworkPrefabs.RegisterNetworkPrefab(val.enemyPrefab);
			RegisterEnemyWithConfig(PluginConfig.WeightDefault.Value, PluginConfig.WeightPerMoons.Value, val, terminalNode, terminalKeyword);
			Logger.LogInfo((object)"Plugin VectorV.TheCabinet is loaded!");
		}

		private static void RegisterEnemyWithConfig(int configBaseRarity, string configMoonRarity, EnemyType enemy, TerminalNode terminalNode, TerminalKeyword terminalKeyword)
		{
			var (dictionary, dictionary2) = ConfigParsing(configBaseRarity, configMoonRarity);
			Enemies.RegisterEnemy(enemy, dictionary, dictionary2, terminalNode, terminalKeyword);
		}

		private static (Dictionary<LevelTypes, int> spawnRateByLevelType, Dictionary<string, int> spawnRateByCustomLevelType) ConfigParsing(int configBaseRarity, string configMoonRarity)
		{
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			configMoonRarity += $",All:{configBaseRarity}";
			Logger.LogMessage((object)("Registering using the following string :\n" + configMoonRarity));
			Dictionary<LevelTypes, int> dictionary = new Dictionary<LevelTypes, int>();
			Dictionary<string, int> dictionary2 = new Dictionary<string, int>();
			foreach (string item in from s in configMoonRarity.Split(',')
				select s.Trim())
			{
				string[] array = (from s in item.Split(':')
					select s.Trim()).ToArray();
				if (array.Length != 2)
				{
					continue;
				}
				string text = array[0].ToLowerInvariant();
				if (!int.TryParse(array[1], out var result))
				{
					continue;
				}
				if (text == "custom")
				{
					text = "modded";
				}
				if (Enum.TryParse<LevelTypes>(text, ignoreCase: true, out LevelTypes result2))
				{
					dictionary[result2] = result;
					Logger.LogDebug((object)$"Registered spawn rate for level type {result2} to {result}");
					continue;
				}
				string value = text + "Level";
				if (Enum.TryParse<LevelTypes>(value, ignoreCase: true, out result2))
				{
					dictionary[result2] = result;
					Logger.LogDebug((object)$"Registered spawn rate for level type {result2} to {result}");
				}
				else
				{
					dictionary2[text] = result;
					Logger.LogDebug((object)$"Registered spawn rate for custom level type {text} to {result}");
				}
			}
			return (dictionary, dictionary2);
		}

		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);
					}
				}
			}
		}
	}
	public class PluginConfig
	{
		public static ConfigEntry<int> WeightDefault;

		public static ConfigEntry<string> WeightPerMoons { get; private set; }

		public static ConfigEntry<float> WarningDuration { get; private set; }

		public static ConfigEntry<float> KillingStateSpeed { get; private set; }

		public static ConfigEntry<bool> DropItemsWhenAngry { get; private set; }

		public static ConfigEntry<float> MaxCarryWeight { get; private set; }

		public static ConfigEntry<bool> DecalsEnabled { get; private set; }

		public static ConfigEntry<int> ParticlesAmount { get; private set; }

		public PluginConfig(ConfigFile cfg)
		{
			WeightDefault = cfg.Bind<int>("Spawning", "Spawn weight by default", 5, "The spawn weight for The Cabinet for every Moon not specified in the setting below.");
			WeightPerMoons = cfg.Bind<string>("Spawning", "Spawn weight per Moons", "Experimentation:1,Assurance:0,Vow:7,Offense:0,March:8,Adamance:12,Rend:150,Dine:20,Titan:80,Embrion:40,Artifice:310,attenuation:1,retinue:8,volition:45,detritus:30,icebound:26,collateral:2,hydro:6,landslide:1,integrity:28,humidity:36,submersion:13,corrosion:2,vertigo:18,brutality:80,devastation:9,acidir:29,asteroid13:0,atlantica:0,Berunah:17,calist:19,core:0,cubatres:31,demetrica:14,dreck:9,ducksteroid14:0,empra:56,etern:31,faith:19,filitrios:14,fissionc:20,gratar:0,hyve:0,hyx:20,infernis:0,junic:0,lecaro:0,motra:0,polarus:16,Repress:18,Roart:8,thalasso:0,trite:19,utril:11,wither:56", "The spawn weight for The Cabinet on a specific Moon.\nYou can specify any Vanilla or Modded Moon name.");
			WarningDuration = cfg.Bind<float>("Customization", "Warning duration", 1.5f, "The time it take for the Cabinet to get angry when looked at.");
			KillingStateSpeed = cfg.Bind<float>("Customization", "Killing state speed", 10f, "The movement speed of the Cabinet when angry.");
			DropItemsWhenAngry = cfg.Bind<bool>("Customization", "Drop items when angry", false, "Does the Cabinet drop all the items it is carrying when angry ?");
			MaxCarryWeight = cfg.Bind<float>("Customization", "Max carry weight", 100f, "The maximum weight in pounds the Cabinet can carry.");
			DecalsEnabled = cfg.Bind<bool>("Optimization", "Decals enabled", true, "Do the blood particles spawn blood decals on collision ?\nDisable this if you experience lag spikes when the Cabinet kills someone.");
			ParticlesAmount = cfg.Bind<int>("Optimization", "Particles amount", 500, "The amount of blood particles emitted on kill.\nLower this if you experience lag spikes when the Cabinet kills someone.");
			ClearUnusedEntries(cfg);
		}

		private void ClearUnusedEntries(ConfigFile cfg)
		{
			PropertyInfo property = ((object)cfg).GetType().GetProperty("OrphanedEntries", BindingFlags.Instance | BindingFlags.NonPublic);
			Dictionary<ConfigDefinition, string> dictionary = (Dictionary<ConfigDefinition, string>)property.GetValue(cfg, null);
			dictionary.Clear();
			cfg.Save();
		}
	}
	public class StateMachine
	{
		private IState currentState;

		public IState CurrentState => currentState;

		public void ChangeState(IState newState)
		{
			currentState?.Exit();
			currentState = newState;
			currentState.Enter();
		}

		public void Update()
		{
			currentState?.Execute();
		}

		public void DoAiInterval()
		{
			currentState?.ExecuteSlow();
		}
	}
	public class TheCabinetAI : EnemyAI
	{
		[SerializeField]
		private Collider visibleCollider;

		[SerializeField]
		private Collider itemsCollider;

		[SerializeField]
		private Collider interactCollider;

		[SerializeField]
		private Collider scanCollider;

		[SerializeField]
		private Transform itemsParent;

		[SerializeField]
		private Transform deadBodyAnchor;

		[SerializeField]
		private Transform attackCapsulePoint;

		[SerializeField]
		private AudioSource warning1Source;

		[SerializeField]
		private AnimationCurve warning1Curve;

		[SerializeField]
		private AudioSource warning2Source;

		[SerializeField]
		private AnimationCurve warning2Curve;

		[SerializeField]
		private AudioSource warningDoorsSource;

		[SerializeField]
		private AudioSource handStepsSource;

		[SerializeField]
		private List<AudioClip> handStepsSounds = new List<AudioClip>();

		[SerializeField]
		private List<AudioClip> angryHandStepsSounds = new List<AudioClip>();

		[SerializeField]
		private List<AudioClip> openSounds = new List<AudioClip>();

		[SerializeField]
		private List<AudioClip> hurtSounds = new List<AudioClip>();

		[SerializeField]
		private List<AudioClip> hideSounds = new List<AudioClip>();

		[SerializeField]
		private List<AudioClip> hideQuickSounds = new List<AudioClip>();

		[SerializeField]
		private List<AudioClip> revealSounds = new List<AudioClip>();

		[SerializeField]
		private AudioClip angrySound;

		[SerializeField]
		private AudioClip killSound;

		[SerializeField]
		private AudioClip deadSound;

		private Random syncedRandom;

		private StateMachine stateMachine;

		private PlayerControllerB[] playersScripts;

		private PlayerControllerB localPlayer;

		private Vector3 lastPosition;

		private int visionLayers;

		private bool isLocalPlayerLooking;

		private bool[] lookingPlayers;

		private float[] lookingPlayersTime;

		private bool[] killablePlayers;

		private Collider[] localAttackResult;

		private List<PlayerControllerB> playersToKill = new List<PlayerControllerB>();

		private bool isHidden;

		private bool isVulnerable;

		private List<GrabbableObject> carriedItems = new List<GrabbableObject>();

		private float carriedWeight;

		private float annoyance;

		private float warningGauge;

		private DeadBodyInfo deadBody;

		public PlayerControllerB[] PlayersScripts => playersScripts;

		public PlayerControllerB LocalPlayer => localPlayer;

		public bool[] LookingPlayers => lookingPlayers;

		public float[] LookingPlayersTime => lookingPlayersTime;

		public bool[] KillablePlayers => killablePlayers;

		public List<PlayerControllerB> PlayersToKill => playersToKill;

		public bool IsHidden
		{
			get
			{
				return isHidden;
			}
			set
			{
				isHidden = value;
			}
		}

		public bool IsVulnerable
		{
			get
			{
				return isVulnerable;
			}
			set
			{
				isVulnerable = value;
			}
		}

		public override void Start()
		{
			((EnemyAI)this).Start();
			syncedRandom = new Random(StartOfRound.Instance.randomMapSeed);
			Plugin.Logger.LogDebug((object)("RANDOM SEED = " + StartOfRound.Instance.randomMapSeed));
			playersScripts = StartOfRound.Instance.allPlayerScripts;
			localPlayer = GameNetworkManager.Instance.localPlayerController;
			visionLayers = (1 << LayerMask.NameToLayer("Room")) | (1 << LayerMask.NameToLayer("MiscLevelGeometry"));
			lookingPlayers = new bool[playersScripts.Length];
			lookingPlayersTime = new float[playersScripts.Length];
			killablePlayers = new bool[playersScripts.Length];
			localAttackResult = (Collider[])(object)new Collider[playersScripts.Length * 2];
			ToggleHandStepsSettings(angry: false);
			stateMachine = new StateMachine();
			stateMachine.ChangeState(new CabinetState_Wandering(this));
			((MonoBehaviour)this).StartCoroutine(CheckChilds());
		}

		public override void Update()
		{
			((EnemyAI)this).Update();
			if (base.isEnemyDead || StartOfRound.Instance.allPlayersDead)
			{
				return;
			}
			itemsCollider.enabled = isHidden;
			scanCollider.enabled = !isHidden;
			carriedWeight = GetCarriedWeight();
			PlayWarningAudio();
			if (annoyance > 0f)
			{
				annoyance -= Time.deltaTime;
				if (annoyance < 0f)
				{
					annoyance = 0f;
				}
			}
			CheckIfLookedAt();
			stateMachine.Update();
		}

		public void LateUpdate()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = ((Component)this).transform.position - lastPosition;
			float num = ((Vector3)(ref val)).magnitude / Time.deltaTime;
			lastPosition = ((Component)this).transform.position;
			base.creatureAnimator.SetFloat("Velocity", num);
		}

		public override void DoAIInterval()
		{
			if (!base.isEnemyDead && !StartOfRound.Instance.allPlayersDead)
			{
				float num = PluginConfig.MaxCarryWeight.Value;
				if (num < 0f)
				{
					num = float.MaxValue;
				}
				if (((NetworkBehaviour)this).IsOwner && !IsHidden && carriedWeight > num)
				{
					DropItemsClientRpc();
				}
				stateMachine.DoAiInterval();
				((EnemyAI)this).DoAIInterval();
			}
		}

		[ServerRpc]
		public void ChangeStateServerRpc(State state)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Invalid comparison between Unknown and I4
			//IL_00a5: 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)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: 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_0084: Invalid comparison between Unknown and I4
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				if (((NetworkBehaviour)this).OwnerClientId != networkManager.LocalClientId)
				{
					if ((int)networkManager.LogLevel <= 1)
					{
						Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!");
					}
					return;
				}
				ServerRpcParams val = default(ServerRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3842756842u, val, (RpcDelivery)0);
				((FastBufferWriter)(ref val2)).WriteValueSafe<State>(ref state, default(ForEnums));
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3842756842u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
			{
				Plugin.Logger.LogDebug((object)$"Server changing state to {state}");
				ChangeStateClientRpc(state);
			}
		}

		[ClientRpc]
		private void ChangeStateClientRpc(State state)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: 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_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: 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 != 2 && (networkManager.IsServer || networkManager.IsHost))
			{
				ClientRpcParams val = default(ClientRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3716952094u, val, (RpcDelivery)0);
				((FastBufferWriter)(ref val2)).WriteValueSafe<State>(ref state, default(ForEnums));
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3716952094u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
			{
				Plugin.Logger.LogDebug((object)$"Client changing state to {state}");
				switch (state)
				{
				case State.Wandering:
					stateMachine.ChangeState(new CabinetState_Wandering(this));
					break;
				case State.Following:
					stateMachine.ChangeState(new CabinetState_Following(this));
					break;
				case State.Killing:
					stateMachine.ChangeState(new CabinetState_Killing(this));
					break;
				default:
					Plugin.Logger.LogError((object)$"Unknow state \"{state}\"");
					break;
				}
			}
		}

		public override void HitEnemy(int force = 1, PlayerControllerB? playerWhoHit = null, bool playHitSFX = false, int hitID = -1)
		{
			if (base.isEnemyDead)
			{
				return;
			}
			if (force > 3)
			{
				force = 3;
			}
			if (IsVulnerable)
			{
				force *= 3;
			}
			base.enemyHP -= force;
			isHidden = false;
			if (base.enemyHP <= 0)
			{
				base.creatureSFX.Stop();
				base.creatureVoice.Stop();
				((EnemyAI)this).KillEnemyOnOwnerClient(false);
				return;
			}
			PlayAudio("hit");
			PlayAudio("hurt");
			if (((NetworkBehaviour)this).IsOwner && (Object)(object)playerWhoHit != (Object)null)
			{
				if (!playersToKill.Contains(playerWhoHit))
				{
					playersToKill.Add(playerWhoHit);
				}
				if (stateMachine.CurrentState.GetType() != typeof(CabinetState_Killing))
				{
					ChangeStateServerRpc(State.Killing);
				}
			}
		}

		public override void KillEnemy(bool destroy = false)
		{
			itemsCollider.enabled = false;
			interactCollider.enabled = false;
			DropItemsClientRpc();
			((EnemyAI)this).KillEnemy(destroy);
		}

		[ClientRpc]
		public void DoAnimationClientRpc(string animationName, AnimatorControllerParameterType type = 9, float value = 1f)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: 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_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_0152: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Expected I4, but got Unknown
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_016b: Invalid comparison between Unknown and I4
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
			{
				ClientRpcParams val = default(ClientRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3597320277u, val, (RpcDelivery)0);
				bool flag = animationName != null;
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives));
				if (flag)
				{
					((FastBufferWriter)(ref val2)).WriteValueSafe(animationName, false);
				}
				((FastBufferWriter)(ref val2)).WriteValueSafe<AnimatorControllerParameterType>(ref type, default(ForEnums));
				((FastBufferWriter)(ref val2)).WriteValueSafe<float>(ref value, default(ForPrimitives));
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3597320277u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 || (!networkManager.IsClient && !networkManager.IsHost))
			{
				return;
			}
			Plugin.Logger.LogDebug((object)$"ANIM \"{animationName}\" ({type}) = {value}");
			switch (type - 1)
			{
			default:
				if ((int)type != 9)
				{
					break;
				}
				base.creatureAnimator.SetTrigger(animationName);
				return;
			case 0:
				base.creatureAnimator.SetFloat(animationName, value);
				return;
			case 2:
				base.creatureAnimator.SetInteger(animationName, Mathf.RoundToInt(value));
				return;
			case 3:
				base.creatureAnimator.SetBool(animationName, value == 1f);
				return;
			case 1:
				break;
			}
			Plugin.Logger.LogError((object)"Unknown AnimatorControllerParameterType !");
		}

		public NavMeshPath GetPath(Vector3 destination, Vector3? origin = null)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Expected O, but got Unknown
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			if (!origin.HasValue)
			{
				origin = ((Component)this).transform.position;
			}
			NavMeshHit val = default(NavMeshHit);
			NavMesh.SamplePosition(destination, ref val, 1f, base.agent.areaMask);
			NavMeshPath val2 = new NavMeshPath();
			NavMesh.CalculatePath(origin.Value, ((NavMeshHit)(ref val)).position, base.agent.areaMask, val2);
			return val2;
		}

		public void CheckIfLookedAt()
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			bool flag;
			if (!HasLineOfSight(localPlayer))
			{
				flag = false;
			}
			else
			{
				Bounds bounds = visibleCollider.bounds;
				Plane[] array = GeometryUtility.CalculateFrustumPlanes(localPlayer.gameplayCamera);
				flag = (GeometryUtility.TestPlanesAABB(array, bounds) ? true : false);
			}
			if (flag != isLocalPlayerLooking)
			{
				isLocalPlayerLooking = flag;
				NotifyLookChangeServerRpc(Array.IndexOf(playersScripts, localPlayer), isLocalPlayerLooking);
			}
		}

		public bool HasLineOfSight(PlayerControllerB player)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			RaycastHit val = default(RaycastHit);
			return !Physics.Linecast(((Component)player.playerEye).transform.position, ((Component)visibleCollider).transform.position, ref val, visionLayers, (QueryTriggerInteraction)1);
		}

		[ServerRpc(RequireOwnership = false)]
		private void NotifyLookChangeServerRpc(int playerIndex, bool isLooking)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: 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_008a: 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_00a4: 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.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1517280198u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, playerIndex);
					((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref isLooking, default(ForPrimitives));
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1517280198u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					lookingPlayers[playerIndex] = isLooking;
					lookingPlayersTime[playerIndex] = Time.time;
				}
			}
		}

		public bool IsLookedAt()
		{
			bool[] array = lookingPlayers;
			for (int i = 0; i < array.Length; i++)
			{
				if (array[i])
				{
					return true;
				}
			}
			return false;
		}

		private IEnumerator CheckChilds()
		{
			while (!base.isEnemyDead && !StartOfRound.Instance.allPlayersDead)
			{
				yield return (object)new WaitForSeconds(0.1f);
				for (int num = ((Component)this).transform.childCount - 1; num >= 0; num--)
				{
					GrabbableObject component = ((Component)((Component)this).transform.GetChild(num)).GetComponent<GrabbableObject>();
					if ((Object)(object)component != (Object)null)
					{
						if (((object)component).GetType() == typeof(CaveDwellerPhysicsProp))
						{
							Plugin.Logger.LogWarning((object)"Do not the baby !");
							((Component)component).transform.SetParent((Transform)null, true);
						}
						else
						{
							((Component)component).transform.parent = itemsParent;
							carriedItems.Add(component);
						}
					}
				}
				for (int num2 = carriedItems.Count - 1; num2 >= 0; num2--)
				{
					if (carriedItems[num2].isHeld)
					{
						carriedItems.RemoveAt(num2);
					}
					else if (((object)carriedItems[num2]).GetType() == typeof(FlashlightItem))
					{
						((Component)carriedItems[num2]).transform.rotation = ((Component)this).transform.rotation;
						((Component)carriedItems[num2]).transform.Rotate(0f, 90f, 90f, (Space)1);
					}
				}
			}
		}

		private float GetCarriedWeight()
		{
			float num = 0f;
			foreach (GrabbableObject carriedItem in carriedItems)
			{
				num += (carriedItem.itemProperties.weight - 1f) * 105f;
			}
			return num;
		}

		[ClientRpc]
		public void DropItemsClientRpc()
		{
			//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_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0154: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: 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 != 2 && (networkManager.IsServer || networkManager.IsHost))
			{
				ClientRpcParams val = default(ClientRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1836630204u, val, (RpcDelivery)0);
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1836630204u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
			{
				for (int num = carriedItems.Count - 1; num >= 0; num--)
				{
					GrabbableObject val3 = carriedItems[num];
					carriedItems.RemoveAt(num);
					val3.parentObject = null;
					val3.heldByPlayerOnServer = false;
					((Component)val3).transform.SetParent(StartOfRound.Instance.propsContainer, true);
					val3.EnablePhysics(true);
					val3.EnableItemMeshes(true);
					((Component)val3).transform.localScale = val3.originalScale;
					val3.isHeld = false;
					val3.isPocketed = false;
					val3.startFallingPosition = ((Component)val3).transform.parent.InverseTransformPoint(((Component)val3).transform.position);
					val3.FallToGround(true, false, default(Vector3));
					val3.fallTime = Random.Range(-0.3f, 0.05f);
					((MonoBehaviour)this).StartCoroutine(PlayDropSFX(val3));
				}
			}
		}

		private IEnumerator PlayDropSFX(GrabbableObject item)
		{
			GrabbableObject item2 = item;
			yield return (object)new WaitUntil((Func<bool>)(() => item2.hasHitGround));
			item2.PlayDropSFX();
		}

		public bool IsLocalPlayerAttackable()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			int num = Physics.OverlapCapsuleNonAlloc(attackCapsulePoint.position, attackCapsulePoint.position + attackCapsulePoint.up * 2f, 1f, localAttackResult, LayerMask.GetMask(new string[1] { "Player" }));
			for (int i = 0; i < num; i++)
			{
				PlayerControllerB component = ((Component)localAttackResult[i]).GetComponent<PlayerControllerB>();
				if ((Object)(object)component != (Object)null && ((NetworkBehaviour)((Component)localAttackResult[i]).GetComponent<PlayerControllerB>()).IsOwner)
				{
					return true;
				}
			}
			return false;
		}

		[ServerRpc(RequireOwnership = false)]
		public void NotifyKillableServerRpc(int playerIndex, bool killable)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: 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_008a: 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_00a4: 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.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3549461775u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, playerIndex);
					((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref killable, default(ForPrimitives));
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3549461775u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					killablePlayers[playerIndex] = killable;
				}
			}
		}

		[ClientRpc]
		public void KillLocalPlayerClientRpc(int playerIndex)
		{
			//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)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2709832295u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, playerIndex);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2709832295u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					((MonoBehaviour)this).StartCoroutine(KillPlayer(playerIndex));
				}
			}
		}

		private IEnumerator KillPlayer(int playerId)
		{
			PlayerControllerB killPlayer = StartOfRound.Instance.allPlayerScripts[playerId];
			if ((Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)(object)killPlayer)
			{
				killPlayer.KillPlayer(Vector3.zero, true, (CauseOfDeath)6, 0, default(Vector3));
			}
			float startTime = Time.timeSinceLevelLoad;
			yield return (object)new WaitUntil((Func<bool>)(() => (Object)(object)killPlayer.deadBody != (Object)null || Time.timeSinceLevelLoad - startTime > 2f));
			if ((Object)(object)killPlayer.deadBody == (Object)null)
			{
				Plugin.Logger.LogError((object)"Dead body was not found !");
				yield break;
			}
			deadBody = killPlayer.deadBody;
			deadBody.attachedTo = deadBodyAnchor;
			deadBody.attachedLimb = killPlayer.deadBody.bodyParts[5];
			deadBody.matchPositionExactly = true;
		}

		public void EatBody()
		{
			deadBody.attachedTo = null;
			deadBody.attachedLimb = null;
			deadBody.matchPositionExactly = false;
			((Component)deadBody).gameObject.SetActive(false);
		}

		public void ToggleHandStepsSettings(bool angry)
		{
			handStepsSource.volume = (angry ? 1f : 0.3f);
			handStepsSource.minDistance = (angry ? 5f : 1f);
			handStepsSource.maxDistance = (angry ? 40f : 20f);
		}

		public void PlayWarningAudio()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_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)
			AnimatorStateInfo currentAnimatorStateInfo = base.creatureAnimator.GetCurrentAnimatorStateInfo(0);
			if (((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("Angry"))
			{
				AudioSource obj = warning1Source;
				obj.volume -= 0.01f;
				AudioSource obj2 = warning2Source;
				obj2.volume -= 0.01f;
				AudioSource obj3 = warningDoorsSource;
				obj3.volume -= 0.01f;
				return;
			}
			currentAnimatorStateInfo = base.creatureAnimator.GetCurrentAnimatorStateInfo(0);
			bool flag = ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("Warning");
			if (flag && (!warning1Source.isPlaying || !warning2Source.isPlaying))
			{
				base.creatureSFX.Stop();
				base.creatureVoice.Stop();
				warning1Source.Stop();
				warning2Source.Stop();
				warningDoorsSource.Stop();
				warning1Source.Play();
				warning2Source.Play();
				warningDoorsSource.Play();
			}
			else if (!flag && (warning1Source.isPlaying || warning2Source.isPlaying))
			{
				warning1Source.Stop();
				warning2Source.Stop();
				warningDoorsSource.Stop();
			}
			float num = 1.8f;
			warning1Source.volume = warning1Curve.Evaluate(warningGauge);
			warning1Source.pitch = 1f + warningGauge * (num - 1f);
			warning2Source.volume = warning2Curve.Evaluate(warningGauge);
			warning2Source.pitch = 1f + warningGauge * (num - 1f);
		}

		[ClientRpc]
		public void SetWarningGaugeClientRpc(float value)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: 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_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: 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 != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(723951595u, val, (RpcDelivery)0);
					((FastBufferWriter)(ref val2)).WriteValueSafe<float>(ref value, default(ForPrimitives));
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 723951595u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					warningGauge = value;
				}
			}
		}

		public void OpenCabinet(PlayerControllerB player)
		{
			OpenCabinetServerRpc(Array.IndexOf(playersScripts, player));
		}

		[ServerRpc(RequireOwnership = false)]
		private void OpenCabinetServerRpc(int playerIndex)
		{
			//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)
			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(4137568779u, val, (RpcDelivery)0);
				BytePacker.WriteValueBitPacked(val2, playerIndex);
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 4137568779u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 || (!networkManager.IsServer && !networkManager.IsHost))
			{
				return;
			}
			annoyance += 25f;
			if (annoyance >= 100f)
			{
				if (!playersToKill.Contains(playersScripts[playerIndex]))
				{
					playersToKill.Add(playersScripts[playerIndex]);
				}
				ChangeStateServerRpc(State.Killing);
			}
			else
			{
				DoAnimationClientRpc("Interact", (AnimatorControllerParameterType)9);
			}
		}

		public IEnumerator DelayedExecution<T>(Action<T> method, T param, float delay)
		{
			yield return (object)new WaitForSeconds(delay);
			method?.Invoke(param);
		}

		public void PlayAudio(string audio)
		{
			switch (audio)
			{
			case "angry":
				base.creatureVoice.Stop();
				base.creatureVoice.clip = angrySound;
				base.creatureVoice.Play();
				break;
			case "die":
				base.creatureSFX.PlayOneShot(deadSound);
				break;
			case "handStep":
				handStepsSource.pitch = Random.Range(0.9f, 1.1f);
				handStepsSource.PlayOneShot(handStepsSounds[Random.Range(0, handStepsSounds.Count - 1)]);
				break;
			case "handStepAngry":
				handStepsSource.pitch = Random.Range(0.9f, 1.1f);
				handStepsSource.PlayOneShot(angryHandStepsSounds[Random.Range(0, angryHandStepsSounds.Count - 1)]);
				break;
			case "hide":
			{
				base.creatureVoice.Stop();
				base.creatureSFX.Stop();
				int index = syncedRandom.Next(hideSounds.Count);
				base.creatureSFX.clip = hideSounds[index];
				base.creatureSFX.Play();
				break;
			}
			case "hideQuick":
			{
				base.creatureVoice.Stop();
				base.creatureSFX.Stop();
				int index = syncedRandom.Next(hideQuickSounds.Count);
				base.creatureSFX.clip = hideQuickSounds[index];
				base.creatureSFX.Play();
				break;
			}
			case "hit":
				base.creatureSFX.PlayOneShot(base.enemyType.hitBodySFX);
				WalkieTalkie.TransmitOneShotAudio(base.creatureSFX, base.enemyType.hitBodySFX, 1f);
				break;
			case "hurt":
			{
				int index = syncedRandom.Next(hurtSounds.Count);
				base.creatureVoice.PlayOneShot(hurtSounds[index]);
				break;
			}
			case "kill":
				base.creatureVoice.Stop();
				base.creatureVoice.clip = killSound;
				base.creatureVoice.Play();
				break;
			case "open":
			{
				int index = syncedRandom.Next(openSounds.Count);
				base.creatureVoice.PlayOneShot(openSounds[index]);
				break;
			}
			case "reveal":
			{
				base.creatureVoice.Stop();
				base.creatureSFX.Stop();
				int index = syncedRandom.Next(revealSounds.Count);
				base.creatureSFX.clip = revealSounds[index];
				base.creatureSFX.Play();
				break;
			}
			default:
				Plugin.Logger.LogError((object)("\"" + audio + "\" is not a valid audio !"));
				break;
			}
		}

		public void ApplyFearToPlayers()
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			PlayerControllerB[] array = playersScripts;
			foreach (PlayerControllerB val in array)
			{
				if (!val.isInsideFactory)
				{
					continue;
				}
				float num = 0f;
				if ((Object)(object)val == (Object)(object)base.targetPlayer)
				{
					num = 1f;
				}
				else if (playersToKill.Contains(val))
				{
					num = 0.75f;
				}
				else
				{
					if (!(Vector3.Distance(((Component)this).transform.position, ((Component)val).transform.position) <= 15f))
					{
						continue;
					}
					num = 0.3f;
				}
				ClientRpcParams val2 = default(ClientRpcParams);
				val2.Send = new ClientRpcSendParams
				{
					TargetClientIds = new List<ulong> { val.actualClientId }
				};
				ClientRpcParams clientRpcParams = val2;
				SetFearLevelClientRpc(num, clientRpcParams);
			}
		}

		[ClientRpc]
		private void SetFearLevelClientRpc(float amount, ClientRpcParams clientRpcParams = default(ClientRpcParams))
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: 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_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: 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 != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					FastBufferWriter val = ((NetworkBehaviour)this).__beginSendClientRpc(2078235715u, clientRpcParams, (RpcDelivery)0);
					((FastBufferWriter)(ref val)).WriteValueSafe<float>(ref amount, default(ForPrimitives));
					((NetworkBehaviour)this).__endSendClientRpc(ref val, 2078235715u, clientRpcParams, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					localPlayer.JumpToFearLevel(amount, true);
				}
			}
		}

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

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_TheCabinetAI()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Expected O, but got Unknown
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Expected O, but got Unknown
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Expected O, but got Unknown
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Expected O, but got Unknown
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Expected O, but got Unknown
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(3842756842u, new RpcReceiveHandler(__rpc_handler_3842756842));
			NetworkManager.__rpc_func_table.Add(3716952094u, new RpcReceiveHandler(__rpc_handler_3716952094));
			NetworkManager.__rpc_func_table.Add(3597320277u, new RpcReceiveHandler(__rpc_handler_3597320277));
			NetworkManager.__rpc_func_table.Add(1517280198u, new RpcReceiveHandler(__rpc_handler_1517280198));
			NetworkManager.__rpc_func_table.Add(1836630204u, new RpcReceiveHandler(__rpc_handler_1836630204));
			NetworkManager.__rpc_func_table.Add(3549461775u, new RpcReceiveHandler(__rpc_handler_3549461775));
			NetworkManager.__rpc_func_table.Add(2709832295u, new RpcReceiveHandler(__rpc_handler_2709832295));
			NetworkManager.__rpc_func_table.Add(723951595u, new RpcReceiveHandler(__rpc_handler_723951595));
			NetworkManager.__rpc_func_table.Add(4137568779u, new RpcReceiveHandler(__rpc_handler_4137568779));
			NetworkManager.__rpc_func_table.Add(2078235715u, new RpcReceiveHandler(__rpc_handler_2078235715));
		}

		private static void __rpc_handler_3842756842(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: 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_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: 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_0055: Invalid comparison between Unknown and I4
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if (rpcParams.Server.Receive.SenderClientId != target.OwnerClientId)
			{
				if ((int)networkManager.LogLevel <= 1)
				{
					Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!");
				}
			}
			else
			{
				State state = default(State);
				((FastBufferReader)(ref reader)).ReadValueSafe<State>(ref state, default(ForEnums));
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((TheCabinetAI)(object)target).ChangeStateServerRpc(state);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_3716952094(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_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				State state = default(State);
				((FastBufferReader)(ref reader)).ReadValueSafe<State>(ref state, default(ForEnums));
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((TheCabinetAI)(object)target).ChangeStateClientRpc(state);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_3597320277(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_0067: 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_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: 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_00b9: 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 animationName = null;
				if (flag)
				{
					((FastBufferReader)(ref reader)).ReadValueSafe(ref animationName, false);
				}
				AnimatorControllerParameterType type = default(AnimatorControllerParameterType);
				((FastBufferReader)(ref reader)).ReadValueSafe<AnimatorControllerParameterType>(ref type, default(ForEnums));
				float value = default(float);
				((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref value, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((TheCabinetAI)(object)target).DoAnimationClientRpc(animationName, type, value);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1517280198(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: 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_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				int playerIndex = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref playerIndex);
				bool isLooking = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref isLooking, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((TheCabinetAI)(object)target).NotifyLookChangeServerRpc(playerIndex, isLooking);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1836630204(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)2;
				((TheCabinetAI)(object)target).DropItemsClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_3549461775(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: 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_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				int playerIndex = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref playerIndex);
				bool killable = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref killable, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((TheCabinetAI)(object)target).NotifyKillableServerRpc(playerIndex, killable);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_2709832295(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 playerIndex = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref playerIndex);
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((TheCabinetAI)(object)target).KillLocalPlayerClientRpc(playerIndex);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_723951595(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_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				float warningGaugeClientRpc = default(float);
				((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref warningGaugeClientRpc, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((TheCabinetAI)(object)target).SetWarningGaugeClientRpc(warningGaugeClientRpc);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_4137568779(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 playerIndex = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref playerIndex);
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((TheCabinetAI)(object)target).OpenCabinetServerRpc(playerIndex);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_2078235715(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_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				float amount = default(float);
				((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref amount, default(ForPrimitives));
				ClientRpcParams client = rpcParams.Client;
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((TheCabinetAI)(object)target).SetFearLevelClientRpc(amount, client);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "TheCabinetAI";
		}
	}
	public enum State
	{
		Wandering,
		Following,
		Killing
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "VectorV.TheCabinet";

		public const string PLUGIN_NAME = "TheCabinet";

		public const string PLUGIN_VERSION = "1.7.0";
	}
}
namespace VectorV.TheCabinet.NetcodePatcher
{
	[AttributeUsage(AttributeTargets.Module)]
	internal class NetcodePatchedAssemblyAttribute : Attribute
	{
	}
}