Decompiled source of Scopophobia v1.1.5

Scopophobia.dll

Decompiled 3 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using LethalLib;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using Scopophobia;
using Scopophobia.NetcodePatcher;
using Scopophobia.Patches;
using Unity.Collections;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.AI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyCompany("Scopophobia")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Adds the Shy Guy (SCP-096) to Lethal Company. Fully custom animations and behavior. Model from SCP: Containment Breach.")]
[assembly: AssemblyFileVersion("1.1.5")]
[assembly: AssemblyInformationalVersion("1.1.5")]
[assembly: AssemblyProduct("Scopophobia")]
[assembly: AssemblyTitle("Scopophobia")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.1.5.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;
		}
	}
}
[HarmonyPatch(typeof(RoundManager))]
internal class ShyGuySpawnSettings
{
	public static string[] InsideOnly = new string[6] { "Level1Experimentation", "Level2Assurance", "Level3Vow", "Level4March", "Level7Offense", "Level6Adamance" };

	[HarmonyPatch("BeginEnemySpawning")]
	[HarmonyPrefix]
	public static void UpdateSpawnRates(ref SelectableLevel ___currentLevel)
	{
		//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
		//IL_0101: Unknown result type (might be due to invalid IL or missing references)
		//IL_0112: Unknown result type (might be due to invalid IL or missing references)
		//IL_0117: Unknown result type (might be due to invalid IL or missing references)
		//IL_011c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0126: Expected O, but got Unknown
		if (Config.DisableSpawnRates)
		{
			ScopophobiaPlugin.logger.LogInfo((object)"Scopophobia Spawn Settings are disabled in config. Ignoring...");
		}
		else
		{
			if (!Config.appears || ScopophobiaPlugin.shyPrefab == null)
			{
				return;
			}
			try
			{
				SpawnableEnemyWithRarity shyPrefab = ScopophobiaPlugin.shyPrefab;
				List<SpawnableEnemyWithRarity> enemies = ___currentLevel.Enemies;
				for (int i = 0; i < ___currentLevel.Enemies.Count; i++)
				{
					SpawnableEnemyWithRarity val = ___currentLevel.Enemies[i];
					if (val.enemyType.enemyName.ToLower() == "shy guy")
					{
						enemies.Remove(val);
					}
				}
				___currentLevel.Enemies = enemies;
				shyPrefab.enemyType.PowerLevel = Config.ShyGuyPowerLevel;
				shyPrefab.rarity = Config.spawnRarity;
				shyPrefab.enemyType.probabilityCurve = new AnimationCurve((Keyframe[])(object)new Keyframe[3]
				{
					new Keyframe(0f, Config.startEnemySpawnCurve),
					new Keyframe(0.5f, Config.midEnemySpawnCurve),
					new Keyframe(1f, Config.endEnemySpawnCurve)
				});
				shyPrefab.enemyType.MaxCount = Config.maxSpawnCount;
				shyPrefab.enemyType.isOutsideEnemy = Config.canSpawnOutside;
				if (Config.canSpawnOutside & (!Config.spawnOutsideHardPlanets || !InsideOnly.Contains(___currentLevel.sceneName)))
				{
					___currentLevel.OutsideEnemies.Add(shyPrefab);
					SelectableLevel val2 = ___currentLevel;
					val2.maxOutsideEnemyPowerCount += shyPrefab.enemyType.MaxCount * (int)shyPrefab.enemyType.PowerLevel;
				}
				___currentLevel.Enemies.Add(shyPrefab);
			}
			catch
			{
			}
		}
	}
}
[Serializable]
public class SyncedInstance<T>
{
	[NonSerialized]
	protected static int IntSize = 4;

	internal static CustomMessagingManager MessageManager => NetworkManager.Singleton.CustomMessagingManager;

	internal static bool IsClient => NetworkManager.Singleton.IsClient;

	internal static bool IsHost => NetworkManager.Singleton.IsHost;

	public static T Default { get; private set; }

	public static T Instance { get; private set; }

	public static bool Synced { get; internal set; }

	protected void InitInstance(T instance)
	{
		Default = instance;
		Instance = instance;
		IntSize = 4;
	}

	internal static void SyncInstance(byte[] data)
	{
		Instance = DeserializeFromBytes(data);
		Synced = true;
	}

	internal static void RevertSync()
	{
		Instance = Default;
		Synced = false;
	}

	public static byte[] SerializeToBytes(T val)
	{
		BinaryFormatter binaryFormatter = new BinaryFormatter();
		using MemoryStream memoryStream = new MemoryStream();
		try
		{
			binaryFormatter.Serialize(memoryStream, val);
			return memoryStream.ToArray();
		}
		catch (Exception arg)
		{
			Plugin.logger.LogError((object)$"Error serializing instance: {arg}");
			return null;
		}
	}

	public static T DeserializeFromBytes(byte[] data)
	{
		BinaryFormatter binaryFormatter = new BinaryFormatter();
		using MemoryStream serializationStream = new MemoryStream(data);
		try
		{
			return (T)binaryFormatter.Deserialize(serializationStream);
		}
		catch (Exception arg)
		{
			Plugin.logger.LogError((object)$"Error deserializing instance: {arg}");
			return default(T);
		}
	}
}
namespace scopophobia
{
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "Scopophobia";

		public const string PLUGIN_NAME = "Scopophobia";

		public const string PLUGIN_VERSION = "1.1.14";
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute([In] int obj0)
		{
			Version = obj0;
		}
	}
}
namespace ShyGuy.AI
{
	public class ShyGuyAI : EnemyAI
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static RpcReceiveHandler <0>____rpc_handler_2556963367;

			public static RpcReceiveHandler <1>____rpc_handler_2298532976;

			public static RpcReceiveHandler <2>____rpc_handler_652446748;

			public static RpcReceiveHandler <3>____rpc_handler_2536632143;

			public static RpcReceiveHandler <4>____rpc_handler_1207108010;

			public static RpcReceiveHandler <5>____rpc_handler_1413965488;
		}

		private Transform localPlayerCamera;

		private Vector3 mainEntrancePosition;

		public Collider mainCollider;

		public AudioSource farAudio;

		public AudioSource footstepSource;

		public AudioClip screamSFX;

		public AudioClip panicSFX;

		public AudioClip crySFX;

		public AudioClip crySittingSFX;

		public AudioClip killPlayerSFX;

		[Header("Containment Breach Sounds")]
		public AudioClip screamSFX_CB;

		public AudioClip panicSFX_CB;

		public AudioClip crySFX_CB;

		public AudioClip killPlayerSFX_CB;

		[Header("Alpha Containment Breach Sounds")]
		public AudioClip screamSFX_ACB;

		public AudioClip panicSFX_ACB;

		public AudioClip crySFX_ACB;

		public AudioClip killPlayerSFX_ACB;

		[Header("Secret Laboratory Sounds")]
		public AudioClip screamSFX_SL;

		public AudioClip panicSFX_SL;

		public AudioClip crySFX_SL;

		public AudioClip killPlayerSFX_SL;

		public Material bloodyMaterial;

		public AISearchRoutine roamMap;

		public Transform shyGuyFace;

		private Vector3 spawnPosition;

		private Vector3 previousPosition;

		private int previousState = -1;

		private float roamWaitTime = 40f;

		private bool roamShouldSit;

		private bool sitting;

		private float lastRunSpeed;

		private float seeFaceTime;

		private float triggerTime;

		private float triggerDuration = 66.4f;

		private float timeToTrigger = 0.5f;

		private float lastInterval = Time.realtimeSinceStartup;

		private bool inKillAnimation;

		private bool isInElevatorStartRoom;

		private float timeAtLastUsingEntrance;

		private MineshaftElevatorController elevatorScript;

		public List<PlayerControllerB> SCP096Targets = new List<PlayerControllerB>();

		public override void Start()
		{
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Expected O, but got Unknown
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Expected O, but got Unknown
			//IL_030e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0313: Unknown result type (might be due to invalid IL or missing references)
			//IL_031f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0342: Unknown result type (might be due to invalid IL or missing references)
			//IL_0349: Unknown result type (might be due to invalid IL or missing references)
			//IL_034f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0357: Unknown result type (might be due to invalid IL or missing references)
			//IL_035c: Unknown result type (might be due to invalid IL or missing references)
			//IL_040d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0417: Expected O, but got Unknown
			((EnemyAI)this).Start();
			triggerDuration = Config.triggerTime;
			Transform val = null;
			Queue<Transform> queue = new Queue<Transform>();
			queue.Enqueue(((Component)this).transform);
			while (queue.Count > 0)
			{
				Transform val2 = queue.Dequeue();
				if (((Object)val2).name == "lefteye")
				{
					val = val2;
					break;
				}
				foreach (Transform item3 in val2)
				{
					Transform item = item3;
					queue.Enqueue(item);
				}
			}
			Transform val3 = null;
			queue = new Queue<Transform>();
			queue.Enqueue(((Component)this).transform);
			while (queue.Count > 0)
			{
				Transform val4 = queue.Dequeue();
				if (((Object)val4).name == "righteye")
				{
					val3 = val4;
					break;
				}
				foreach (Transform item4 in val4)
				{
					Transform item2 = item4;
					queue.Enqueue(item2);
				}
			}
			if (!Config.hasGlowingEyes && (Object)(object)val != (Object)null && (Object)(object)val3 != (Object)null)
			{
				((Component)val).gameObject.SetActive(false);
				((Component)val3).gameObject.SetActive(false);
			}
			if (Config.bloodyTexture && (Object)(object)bloodyMaterial != (Object)null)
			{
				Transform val5 = ((Component)this).transform.Find("SCP096Model");
				if ((Object)(object)val5 != (Object)null)
				{
					Transform val6 = val5.Find("tsg_placeholder");
					if ((Object)(object)val6 != (Object)null)
					{
						SkinnedMeshRenderer component = ((Component)val6).GetComponent<SkinnedMeshRenderer>();
						if ((Object)(object)component != (Object)null)
						{
							((Renderer)component).material = bloodyMaterial;
						}
					}
				}
			}
			switch (Config.soundPack)
			{
			case "SCPCB":
				screamSFX = screamSFX_CB;
				crySFX = crySFX_CB;
				crySittingSFX = crySFX_CB;
				panicSFX = panicSFX_CB;
				killPlayerSFX = killPlayerSFX_CB;
				break;
			case "SCPCBOld":
				screamSFX = screamSFX_ACB;
				crySFX = crySFX_ACB;
				crySittingSFX = crySFX_ACB;
				panicSFX = panicSFX_ACB;
				killPlayerSFX = killPlayerSFX_ACB;
				break;
			case "SecretLab":
				screamSFX = screamSFX_SL;
				crySFX = crySFX_SL;
				crySittingSFX = crySFX_SL;
				panicSFX = panicSFX_SL;
				killPlayerSFX = killPlayerSFX_SL;
				break;
			}
			localPlayerCamera = ((Component)GameNetworkManager.Instance.localPlayerController.gameplayCamera).transform;
			spawnPosition = ((Component)this).transform.position;
			base.isOutside = ((Component)this).transform.position.y > -80f;
			mainEntrancePosition = RoundManager.Instance.GetNavMeshPosition(RoundManager.FindMainEntrancePosition(true, base.isOutside), default(NavMeshHit), 5f, -1);
			if (base.isOutside)
			{
				if (base.allAINodes == null || base.allAINodes.Length == 0)
				{
					base.allAINodes = GameObject.FindGameObjectsWithTag("OutsideAINode");
				}
				if ((Object)(object)GameNetworkManager.Instance.localPlayerController != (Object)null)
				{
					((EnemyAI)this).EnableEnemyMesh(!StartOfRound.Instance.hangarDoorsClosed || !GameNetworkManager.Instance.localPlayerController.isInHangarShipRoom, false);
				}
			}
			else if (base.allAINodes == null || base.allAINodes.Length == 0)
			{
				base.allAINodes = GameObject.FindGameObjectsWithTag("AINode");
			}
			base.path1 = new NavMeshPath();
			base.openDoorSpeedMultiplier = 450f;
			SetShyGuyInitialValues();
		}

		private void CalculateAnimationSpeed()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = ((Component)this).transform.position - previousPosition;
			float num = ((Vector3)(ref val)).magnitude;
			if (num > 0f)
			{
				num = 1f;
			}
			lastRunSpeed = Mathf.Lerp(lastRunSpeed, num, 5f * Time.deltaTime);
			base.creatureAnimator.SetFloat("VelocityZ", lastRunSpeed);
			previousPosition = ((Component)this).transform.position;
		}

		public override void DoAIInterval()
		{
			//IL_05de: Unknown result type (might be due to invalid IL or missing references)
			//IL_05ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_0532: Unknown result type (might be due to invalid IL or missing references)
			//IL_053d: Unknown result type (might be due to invalid IL or missing references)
			//IL_066f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0675: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_06cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0698: Unknown result type (might be due to invalid IL or missing references)
			//IL_055c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0567: Unknown result type (might be due to invalid IL or missing references)
			//IL_056c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0766: Unknown result type (might be due to invalid IL or missing references)
			//IL_0776: Unknown result type (might be due to invalid IL or missing references)
			//IL_071d: Unknown result type (might be due to invalid IL or missing references)
			//IL_072d: Unknown result type (might be due to invalid IL or missing references)
			((EnemyAI)this).DoAIInterval();
			if (StartOfRound.Instance.livingPlayers == 0)
			{
				lastInterval = Time.realtimeSinceStartup;
				return;
			}
			if (base.isEnemyDead)
			{
				lastInterval = Time.realtimeSinceStartup;
				return;
			}
			if (!((NetworkBehaviour)this).IsServer && ((NetworkBehaviour)this).IsOwner && base.currentBehaviourStateIndex != 2)
			{
				((EnemyAI)this).ChangeOwnershipOfEnemy(StartOfRound.Instance.allPlayerScripts[0].actualClientId);
			}
			switch (base.currentBehaviourStateIndex)
			{
			case 0:
			{
				if (base.stunNormalizedTimer > 0f)
				{
					base.agent.speed = 0f;
				}
				else if (sitting)
				{
					base.agent.speed = 0f;
				}
				else
				{
					roamWaitTime -= Time.realtimeSinceStartup - lastInterval;
					base.openDoorSpeedMultiplier = 1f;
					base.agent.speed = 2.75f * Config.speedDocileMultiplier;
				}
				base.movingTowardsTargetPlayer = false;
				base.agent.stoppingDistance = 4f;
				base.addPlayerVelocityToDestination = 0f;
				PlayerControllerB targetPlayer2 = base.targetPlayer;
				if (roamWaitTime <= 20f && roamMap.inProgress && (Object)(object)base.targetPlayer == (Object)null)
				{
					((EnemyAI)this).StopSearch(roamMap, true);
					lastInterval = Time.realtimeSinceStartup;
				}
				else if (roamWaitTime > 2.5f && roamWaitTime <= 15f && !roamMap.inProgress && (Object)(object)base.targetPlayer == (Object)null && roamShouldSit)
				{
					base.creatureVoice.Stop();
					sitting = true;
					base.creatureAnimator.SetBool("Sitting", true);
					base.creatureVoice.volume = 0.5f;
					float time = base.creatureVoice.time;
					base.creatureVoice.clip = crySittingSFX;
					((Component)base.creatureVoice).GetComponent<AudioSource>().time = time;
					base.creatureVoice.Play();
					lastInterval = Time.realtimeSinceStartup;
				}
				else if (!((Object)(object)base.targetPlayer != (Object)null) && (Object)(object)base.targetPlayer == (Object)null && !roamMap.inProgress && roamWaitTime <= 0f)
				{
					if (!sitting)
					{
						roamShouldSit = Random.Range(1, 5) == 1;
						roamWaitTime = Random.Range(25f, 32.5f);
						((EnemyAI)this).StartSearch(spawnPosition, roamMap);
						lastInterval = Time.realtimeSinceStartup;
						break;
					}
					base.creatureVoice.Stop();
					sitting = false;
					roamShouldSit = false;
					roamWaitTime = Random.Range(21f, 25f);
					base.creatureAnimator.SetBool("Sitting", false);
					base.creatureVoice.volume = 0.5f;
					base.creatureVoice.clip = crySFX;
					float time2 = base.creatureVoice.time;
					((Component)base.creatureVoice).GetComponent<AudioSource>().time = time2;
					base.creatureVoice.Play();
					lastInterval = Time.realtimeSinceStartup;
				}
				break;
			}
			case 1:
				base.agent.speed = 0f;
				lastInterval = Time.realtimeSinceStartup;
				base.movingTowardsTargetPlayer = false;
				break;
			case 2:
			{
				base.agent.stoppingDistance = 0f;
				base.agent.avoidancePriority = 60;
				base.openDoorSpeedMultiplier = 450f;
				mainCollider.isTrigger = true;
				base.addPlayerVelocityToDestination = 1f;
				if (inKillAnimation)
				{
					base.agent.speed = 0f;
				}
				else
				{
					base.agent.speed = Mathf.Clamp(base.agent.speed + (Time.realtimeSinceStartup - lastInterval) * Config.speedRageMultiplier * 1.1f, 5f * Config.speedRageMultiplier, 14.75f * Config.speedRageMultiplier);
				}
				if (SCP096Targets.Count <= 0)
				{
					SitDown();
					break;
				}
				PlayerControllerB targetPlayer = base.targetPlayer;
				float num = float.PositiveInfinity;
				foreach (PlayerControllerB sCP096Target in SCP096Targets)
				{
					bool flag = sCP096Target.isInsideFactory == !base.isOutside;
					bool flag2 = true;
					if (!Config.canExitFacility && !flag)
					{
						flag2 = false;
					}
					if (!sCP096Target.isPlayerDead && flag2)
					{
						if (((EnemyAI)this).PlayerIsTargetable(sCP096Target, false, true) && Vector3.Distance(((Component)sCP096Target).transform.position, ((Component)this).transform.position) < num)
						{
							num = Vector3.Magnitude(((Component)sCP096Target).transform.position - ((Component)this).transform.position);
							base.targetPlayer = sCP096Target;
						}
					}
					else
					{
						AddTargetToList((int)sCP096Target.actualClientId, remove: true);
					}
				}
				if ((Object)(object)base.targetPlayer != (Object)null)
				{
					bool flag3 = false;
					base.creatureAnimator.SetFloat("DistanceToTarget", Vector3.Distance(((Component)this).transform.position, ((Component)base.targetPlayer).transform.position));
					if (roamMap.inProgress)
					{
						((EnemyAI)this).StopSearch(roamMap, true);
					}
					if ((Object)(object)base.targetPlayer != (Object)(object)targetPlayer)
					{
						((EnemyAI)this).ChangeOwnershipOfEnemy(base.targetPlayer.actualClientId);
					}
					if (base.targetPlayer.isInsideFactory != !base.isOutside)
					{
						if (Vector3.Distance(((Component)this).transform.position, mainEntrancePosition) < 2f)
						{
							TeleportEnemy(RoundManager.FindMainEntrancePosition(true, !base.isOutside), !base.isOutside);
							base.agent.speed = 0f;
							break;
						}
						base.movingTowardsTargetPlayer = false;
						((EnemyAI)this).SetDestinationToPosition(mainEntrancePosition, false);
						elevatorScript = Object.FindObjectOfType<MineshaftElevatorController>();
						if (!((Object)(object)elevatorScript != (Object)null))
						{
							break;
						}
						ScopophobiaPlugin.logger.LogInfo((object)"Starting Elevator Checks");
						if (isInElevatorStartRoom)
						{
							if (Vector3.Distance(((Component)this).transform.position, elevatorScript.elevatorBottomPoint.position) < 3f)
							{
								isInElevatorStartRoom = false;
								ScopophobiaPlugin.logger.LogInfo((object)"Shy guy is at Lower Elevator");
							}
						}
						else if (Vector3.Distance(((Component)this).transform.position, elevatorScript.elevatorTopPoint.position) < 3f)
						{
							isInElevatorStartRoom = true;
							ScopophobiaPlugin.logger.LogInfo((object)"Shy guy is at Upper Elevator");
						}
						if (RoundManager.Instance.currentDungeonType == 4)
						{
							if (!isInElevatorStartRoom)
							{
								UseElevator(goUp: true);
							}
							else if (!base.targetPlayer.isPlayerDead && base.targetPlayer.isPlayerControlled && base.targetPlayer.isInsideFactory)
							{
								UseElevator(goUp: false);
							}
							else
							{
								flag3 = true;
							}
						}
					}
					else
					{
						((EnemyAI)this).SetMovingTowardsTargetPlayer(base.targetPlayer);
					}
				}
				else if (SCP096Targets.Count <= 0)
				{
					SitDown();
				}
				break;
			}
			default:
				lastInterval = Time.realtimeSinceStartup;
				break;
			}
		}

		public void TeleportEnemy(Vector3 pos, bool setOutside)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			Vector3 navMeshPosition = RoundManager.Instance.GetNavMeshPosition(pos, default(NavMeshHit), 5f, -1);
			if (((NetworkBehaviour)this).IsOwner)
			{
				((Behaviour)base.agent).enabled = false;
				((Component)this).transform.position = navMeshPosition;
				((Behaviour)base.agent).enabled = true;
			}
			else
			{
				((Component)this).transform.position = navMeshPosition;
			}
			base.serverPosition = navMeshPosition;
			SetEnemyOutside(setOutside);
			EntranceTeleport val = RoundManager.FindMainEntranceScript(setOutside);
			if (val.doorAudios != null && val.doorAudios.Length != 0)
			{
				val.entrancePointAudio.PlayOneShot(val.doorAudios[0]);
				WalkieTalkie.TransmitOneShotAudio(val.entrancePointAudio, val.doorAudios[0], 1f);
			}
		}

		private bool UseElevator(bool goUp)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: 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_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: 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_00bc: 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_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_0167: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = ((!goUp) ? elevatorScript.elevatorTopPoint.position : elevatorScript.elevatorBottomPoint.position);
			if (elevatorScript.elevatorFinishedMoving && !((EnemyAI)this).PathIsIntersectedByLineOfSight(elevatorScript.elevatorInsidePoint.position, false, false, false))
			{
				if (elevatorScript.elevatorDoorOpen && Vector3.Distance(((Component)this).transform.position, elevatorScript.elevatorInsidePoint.position) < 1f && elevatorScript.elevatorMovingDown == goUp)
				{
					elevatorScript.PressElevatorButtonOnServer(true);
				}
				((EnemyAI)this).SetDestinationToPosition(elevatorScript.elevatorInsidePoint.position, false);
				return true;
			}
			if (Vector3.Distance(((Component)this).transform.position, elevatorScript.elevatorInsidePoint.position) > 1f && !((EnemyAI)this).PathIsIntersectedByLineOfSight(val, false, false, false))
			{
				if (elevatorScript.elevatorDoorOpen && Vector3.Distance(((Component)this).transform.position, val) < 1f && elevatorScript.elevatorMovingDown != goUp && !elevatorScript.elevatorCalled)
				{
					elevatorScript.CallElevatorOnServer(goUp);
				}
				((EnemyAI)this).SetDestinationToPosition(val, false);
				return true;
			}
			return false;
		}

		public override void Update()
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_016b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_017f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01df: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
			if (base.isEnemyDead || (Object)(object)GameNetworkManager.Instance == (Object)null)
			{
				return;
			}
			CalculateAnimationSpeed();
			bool flag = GameNetworkManager.Instance.localPlayerController.HasLineOfSightToPosition(shyGuyFace.position, Config.faceTriggerRange, 45, -1f);
			if (flag)
			{
				float num = Quaternion.Angle(((Component)GameNetworkManager.Instance.localPlayerController.gameplayCamera).transform.rotation, shyGuyFace.rotation);
				if (!(num <= 145f))
				{
					flag = false;
				}
			}
			if (flag)
			{
				seeFaceTime += Time.deltaTime;
				if (seeFaceTime >= Config.faceTriggerGracePeriod)
				{
					GameNetworkManager.Instance.localPlayerController.JumpToFearLevel(1.25f, true);
					if (!Config.hasMaxTargets || SCP096Targets.Count < Config.maxTargets)
					{
						AddTargetToList((int)GameNetworkManager.Instance.localPlayerController.playerClientId);
					}
					if (base.currentBehaviourStateIndex == 0)
					{
						((EnemyAI)this).SwitchToBehaviourState(1);
					}
				}
			}
			else
			{
				seeFaceTime = Mathf.Clamp(seeFaceTime - Time.deltaTime, 0f, timeToTrigger);
				if (GameNetworkManager.Instance.localPlayerController.HasLineOfSightToPosition(((Component)this).transform.position + Vector3.up * 1f, 30f, 60, -1f) && base.currentBehaviourStateIndex == 0)
				{
					if (!base.thisNetworkObject.IsOwner)
					{
						((EnemyAI)this).ChangeOwnershipOfEnemy(GameNetworkManager.Instance.localPlayerController.actualClientId);
					}
					if (Vector3.Distance(((Component)this).transform.position, ((Component)GameNetworkManager.Instance.localPlayerController).transform.position) < 10f)
					{
						GameNetworkManager.Instance.localPlayerController.JumpToFearLevel(0.65f, true);
					}
					else
					{
						GameNetworkManager.Instance.localPlayerController.JumpToFearLevel(0.25f, true);
					}
				}
			}
			switch (base.currentBehaviourStateIndex)
			{
			case 0:
				if (previousState != 0)
				{
					SetShyGuyInitialValues();
					previousState = 0;
					mainCollider.isTrigger = true;
					farAudio.volume = 0f;
					base.creatureVoice.volume = 0.5f;
					base.creatureVoice.clip = crySFX;
					float time2 = base.creatureVoice.time;
					((Component)base.creatureVoice).GetComponent<AudioSource>().time = time2;
					base.creatureVoice.Play();
				}
				if (!base.creatureVoice.isPlaying)
				{
					base.creatureVoice.volume = 0.5f;
					base.creatureVoice.clip = crySFX;
					float time3 = base.creatureVoice.time;
					((Component)base.creatureVoice).GetComponent<AudioSource>().time = time3;
					base.creatureVoice.Play();
				}
				break;
			case 1:
				if (previousState != 1)
				{
					previousState = 1;
					sitting = false;
					mainCollider.isTrigger = true;
					base.creatureAnimator.SetBool("Rage", false);
					base.creatureAnimator.SetBool("Sitting", false);
					base.creatureAnimator.SetBool("triggered", true);
					base.creatureVoice.Stop();
					float time4 = farAudio.time;
					((Component)farAudio).GetComponent<AudioSource>().time = time4;
					farAudio.volume = 0.275f;
					farAudio.clip = panicSFX;
					farAudio.Play();
					base.agent.speed = 0f;
					triggerTime = triggerDuration;
				}
				triggerTime -= Time.deltaTime;
				if (triggerTime <= 0f)
				{
					((EnemyAI)this).SwitchToBehaviourState(2);
				}
				break;
			case 2:
				mainCollider.isTrigger = true;
				if (previousState != 2)
				{
					mainCollider.isTrigger = true;
					previousState = 2;
					base.creatureAnimator.SetBool("Rage", true);
					base.creatureAnimator.SetBool("triggered", false);
					farAudio.Stop();
					float time = farAudio.time;
					((Component)farAudio).GetComponent<AudioSource>().time = time;
					farAudio.volume = 0.4f;
					farAudio.clip = screamSFX;
					farAudio.Play();
				}
				break;
			}
			((EnemyAI)this).Update();
		}

		public void SetEnemyOutside(bool outside = false)
		{
			//IL_0010: 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_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			base.isOutside = outside;
			mainEntrancePosition = RoundManager.Instance.GetNavMeshPosition(RoundManager.FindMainEntrancePosition(true, outside), default(NavMeshHit), 5f, -1);
			if (outside)
			{
				base.allAINodes = GameObject.FindGameObjectsWithTag("OutsideAINode");
			}
			else
			{
				base.allAINodes = GameObject.FindGameObjectsWithTag("AINode");
			}
		}

		public override void OnCollideWithPlayer(Collider other)
		{
			if (!Object.op_Implicit((Object)(object)((Component)other).gameObject.GetComponent<PlayerControllerB>()))
			{
				return;
			}
			((EnemyAI)this).OnCollideWithPlayer(other);
			if (!inKillAnimation && !base.isEnemyDead && base.currentBehaviourStateIndex == 2)
			{
				PlayerControllerB val = ((EnemyAI)this).MeetsStandardPlayerCollisionConditions(other, false, false);
				if ((Object)(object)val != (Object)null)
				{
					inKillAnimation = true;
					((MonoBehaviour)this).StartCoroutine(killPlayerAnimation((int)val.playerClientId));
					KillPlayerServerRpc((int)val.playerClientId);
				}
			}
		}

		[ServerRpc(RequireOwnership = false)]
		private void KillPlayerServerRpc(int playerId)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Invalid comparison between Unknown and I4
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Invalid comparison between Unknown and I4
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: 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(2556963367u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, playerId);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2556963367u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					KillPlayerClientRpc(playerId);
				}
			}
		}

		[ClientRpc]
		private void KillPlayerClientRpc(int playerId)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Invalid comparison between Unknown and I4
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Invalid comparison between Unknown and I4
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: 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(2298532976u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, playerId);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2298532976u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					((MonoBehaviour)this).StartCoroutine(killPlayerAnimation(playerId));
				}
			}
		}

		private IEnumerator killPlayerAnimation(int playerId)
		{
			inKillAnimation = true;
			PlayerControllerB playerScript = StartOfRound.Instance.allPlayerScripts[playerId];
			if (base.isOutside && ((Component)this).transform.position.y < -80f)
			{
				SetEnemyOutside();
			}
			else if (!base.isOutside && ((Component)this).transform.position.y > -80f)
			{
				SetEnemyOutside(outside: true);
			}
			int preAmount = SCP096Targets.Count;
			playerScript.KillPlayer(((Component)playerScript).transform.position, true, (CauseOfDeath)6, 1, default(Vector3));
			AddTargetToList(playerId, remove: true);
			base.creatureSFX.clip = killPlayerSFX;
			base.creatureSFX.Play();
			base.creatureAnimator.SetInteger("TargetsLeft", preAmount - 1);
			base.creatureAnimator.SetTrigger("kill");
			if (preAmount - 1 <= 0)
			{
				SitDown();
			}
			if (Config.deathMakesBloody && (Object)(object)bloodyMaterial != (Object)null)
			{
				Transform model = ((Component)this).transform.Find("SCP096Model");
				if ((Object)(object)model != (Object)null)
				{
					Transform modelMesh = model.Find("tsg_placeholder");
					if ((Object)(object)modelMesh != (Object)null)
					{
						SkinnedMeshRenderer skinnedModel = ((Component)modelMesh).GetComponent<SkinnedMeshRenderer>();
						if ((Object)(object)skinnedModel != (Object)null)
						{
							((Renderer)skinnedModel).material = bloodyMaterial;
						}
					}
				}
			}
			yield return (object)new WaitForSeconds(1f);
			inKillAnimation = false;
		}

		public void SitDown()
		{
			((EnemyAI)this).SwitchToBehaviourState(0);
			SitDownOnLocalClient();
			SitDownServerRpc();
		}

		[ServerRpc(RequireOwnership = false)]
		private void SitDownServerRpc()
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Invalid comparison between Unknown and I4
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Invalid comparison between Unknown and I4
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_005a: 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(652446748u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 652446748u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					SitDownClientRpc();
				}
			}
		}

		[ClientRpc]
		private void SitDownClientRpc()
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Invalid comparison between Unknown and I4
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Invalid comparison between Unknown and I4
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_005a: 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(2536632143u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2536632143u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					SitDownOnLocalClient();
				}
			}
		}

		public void SitDownOnLocalClient()
		{
			sitting = true;
			roamWaitTime = Random.Range(45f, 50f);
			base.creatureAnimator.SetBool("Rage", false);
			base.creatureAnimator.SetBool("Sitting", true);
		}

		public void AddTargetToList(int playerId, bool remove = false)
		{
			PlayerControllerB item = StartOfRound.Instance.allPlayerScripts[playerId];
			if (remove)
			{
				if (!SCP096Targets.Contains(item))
				{
					return;
				}
			}
			else if (SCP096Targets.Contains(item))
			{
				return;
			}
			AddTargetToListOnLocalClient(playerId, remove);
			AddTargetToListServerRpc(playerId, remove);
		}

		[ServerRpc(RequireOwnership = false)]
		public void AddTargetToListServerRpc(int playerId, bool remove)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Invalid comparison between Unknown and I4
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Invalid comparison between Unknown and I4
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_007a: 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(1207108010u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, playerId);
					((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref remove, default(ForPrimitives));
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1207108010u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					AddTargetToListClientRpc(playerId, remove);
				}
			}
		}

		[ClientRpc]
		public void AddTargetToListClientRpc(int playerId, bool remove)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Invalid comparison between Unknown and I4
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Invalid comparison between Unknown and I4
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_007a: 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(1413965488u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, playerId);
					((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref remove, default(ForPrimitives));
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1413965488u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					AddTargetToListOnLocalClient(playerId, remove);
				}
			}
		}

		public void AddTargetToListOnLocalClient(int playerId, bool remove)
		{
			PlayerControllerB item = StartOfRound.Instance.allPlayerScripts[playerId];
			if (remove)
			{
				if (SCP096Targets.Contains(item))
				{
					SCP096Targets.Remove(item);
				}
			}
			else if (!SCP096Targets.Contains(item))
			{
				SCP096Targets.Add(item);
			}
		}

		private void SetShyGuyInitialValues()
		{
			mainCollider = ((Component)this).gameObject.GetComponentInChildren<Collider>();
			farAudio = ((Component)((Component)this).transform.Find("FarAudio")).GetComponent<AudioSource>();
			base.targetPlayer = null;
			inKillAnimation = false;
			SCP096Targets.Clear();
			base.creatureAnimator.SetFloat("VelocityX", 0f);
			base.creatureAnimator.SetFloat("VelocityZ", 0f);
			base.creatureAnimator.SetFloat("DistanceToTarget", 999f);
			base.creatureAnimator.SetInteger("SitActionTimer", 0);
			base.creatureAnimator.SetInteger("TargetsLeft", 0);
			base.creatureAnimator.SetBool("Rage", false);
			base.creatureAnimator.SetBool("Sitting", false);
			base.creatureAnimator.SetBool("triggered", false);
			mainCollider.isTrigger = true;
			farAudio.volume = 0f;
			farAudio.Stop();
			base.creatureVoice.Stop();
		}

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

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_ShyGuyAI()
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			//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_0051: Expected O, but got Unknown
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Expected O, but got Unknown
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Expected O, but got Unknown
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Expected O, but got Unknown
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: Expected O, but got Unknown
			Dictionary<uint, RpcReceiveHandler> _rpc_func_table = NetworkManager.__rpc_func_table;
			object obj = <>O.<0>____rpc_handler_2556963367;
			if (obj == null)
			{
				RpcReceiveHandler val = __rpc_handler_2556963367;
				<>O.<0>____rpc_handler_2556963367 = val;
				obj = (object)val;
			}
			_rpc_func_table.Add(2556963367u, (RpcReceiveHandler)obj);
			Dictionary<uint, RpcReceiveHandler> _rpc_func_table2 = NetworkManager.__rpc_func_table;
			object obj2 = <>O.<1>____rpc_handler_2298532976;
			if (obj2 == null)
			{
				RpcReceiveHandler val2 = __rpc_handler_2298532976;
				<>O.<1>____rpc_handler_2298532976 = val2;
				obj2 = (object)val2;
			}
			_rpc_func_table2.Add(2298532976u, (RpcReceiveHandler)obj2);
			Dictionary<uint, RpcReceiveHandler> _rpc_func_table3 = NetworkManager.__rpc_func_table;
			object obj3 = <>O.<2>____rpc_handler_652446748;
			if (obj3 == null)
			{
				RpcReceiveHandler val3 = __rpc_handler_652446748;
				<>O.<2>____rpc_handler_652446748 = val3;
				obj3 = (object)val3;
			}
			_rpc_func_table3.Add(652446748u, (RpcReceiveHandler)obj3);
			Dictionary<uint, RpcReceiveHandler> _rpc_func_table4 = NetworkManager.__rpc_func_table;
			object obj4 = <>O.<3>____rpc_handler_2536632143;
			if (obj4 == null)
			{
				RpcReceiveHandler val4 = __rpc_handler_2536632143;
				<>O.<3>____rpc_handler_2536632143 = val4;
				obj4 = (object)val4;
			}
			_rpc_func_table4.Add(2536632143u, (RpcReceiveHandler)obj4);
			Dictionary<uint, RpcReceiveHandler> _rpc_func_table5 = NetworkManager.__rpc_func_table;
			object obj5 = <>O.<4>____rpc_handler_1207108010;
			if (obj5 == null)
			{
				RpcReceiveHandler val5 = __rpc_handler_1207108010;
				<>O.<4>____rpc_handler_1207108010 = val5;
				obj5 = (object)val5;
			}
			_rpc_func_table5.Add(1207108010u, (RpcReceiveHandler)obj5);
			Dictionary<uint, RpcReceiveHandler> _rpc_func_table6 = NetworkManager.__rpc_func_table;
			object obj6 = <>O.<5>____rpc_handler_1413965488;
			if (obj6 == null)
			{
				RpcReceiveHandler val6 = __rpc_handler_1413965488;
				<>O.<5>____rpc_handler_1413965488 = val6;
				obj6 = (object)val6;
			}
			_rpc_func_table6.Add(1413965488u, (RpcReceiveHandler)obj6);
		}

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

		private static void __rpc_handler_2298532976(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0019: 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_0042: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				int playerId = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref playerId);
				((NetworkBehaviour)(ShyGuyAI)(object)target).__rpc_exec_stage = (__RpcExecStage)2;
				((ShyGuyAI)(object)target).KillPlayerClientRpc(playerId);
				((NetworkBehaviour)(ShyGuyAI)(object)target).__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

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

		private static void __rpc_handler_2536632143(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0020: 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)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				((NetworkBehaviour)(ShyGuyAI)(object)target).__rpc_exec_stage = (__RpcExecStage)2;
				((ShyGuyAI)(object)target).SitDownClientRpc();
				((NetworkBehaviour)(ShyGuyAI)(object)target).__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1207108010(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0019: 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_002e: 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_0057: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				int playerId = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref playerId);
				bool remove = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref remove, default(ForPrimitives));
				((NetworkBehaviour)(ShyGuyAI)(object)target).__rpc_exec_stage = (__RpcExecStage)1;
				((ShyGuyAI)(object)target).AddTargetToListServerRpc(playerId, remove);
				((NetworkBehaviour)(ShyGuyAI)(object)target).__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1413965488(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0019: 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_002e: 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_0057: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				int playerId = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref playerId);
				bool remove = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref remove, default(ForPrimitives));
				((NetworkBehaviour)(ShyGuyAI)(object)target).__rpc_exec_stage = (__RpcExecStage)2;
				((ShyGuyAI)(object)target).AddTargetToListClientRpc(playerId, remove);
				((NetworkBehaviour)(ShyGuyAI)(object)target).__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected override string __getTypeName()
		{
			return "ShyGuyAI";
		}
	}
}
namespace Scopophobia
{
	[Serializable]
	public class Config : SyncedInstance<Config>
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static HandleNamedMessageDelegate <0>__OnRequestSync;

			public static HandleNamedMessageDelegate <1>__OnReceiveSync;
		}

		public static ConfigEntry<bool> AppearsConfig;

		public static ConfigEntry<bool> HasGlowingEyesConfig;

		public static ConfigEntry<string> SoundPackConfig;

		public static ConfigEntry<bool> BloodyTextureConfig;

		public static ConfigEntry<bool> DisableSpawnRatesConfig;

		public static ConfigEntry<bool> DeathMakesBloodyConfig;

		public static ConfigEntry<float> SpeedDocileMultiplierConfig;

		public static ConfigEntry<float> SpeedRageMultiplierConfig;

		public static ConfigEntry<int> SpawnRarityConfig;

		public static ConfigEntry<float> TriggerTimeConfig;

		public static ConfigEntry<float> FaceTriggerRangeConfig;

		public static ConfigEntry<float> FaceTriggerGracePeriodConfig;

		public static ConfigEntry<bool> HasMaxTargetsConfig;

		public static ConfigEntry<int> MaxTargetsConfig;

		public static ConfigEntry<bool> CanExitFacilityConfig;

		public static ConfigEntry<int> MaxSpawnCountConfig;

		public static ConfigEntry<bool> CanSpawnOutsideConfig;

		public static ConfigEntry<bool> SpawnOutsideHardPlanetsConfig;

		public static ConfigEntry<float> StartEnemySpawnCurveConfig;

		public static ConfigEntry<float> MidEnemySpawnCurveConfig;

		public static ConfigEntry<float> EndEnemySpawnCurveConfig;

		public static ConfigEntry<float> ShyGuyPowerLevelConfig;

		public static bool appears;

		public static bool hasGlowingEyes;

		public static string soundPack;

		public static bool bloodyTexture;

		public static bool deathMakesBloody;

		public static bool DisableSpawnRates;

		public static float speedDocileMultiplier;

		public static float speedRageMultiplier;

		public static int spawnRarity;

		public static float triggerTime;

		public static float faceTriggerRange;

		public static float faceTriggerGracePeriod;

		public static bool hasMaxTargets;

		public static int maxTargets;

		public static bool canExitFacility;

		public static bool canSpawnOutside;

		public static int maxSpawnCount;

		public static bool spawnsOutside;

		public static bool spawnOutsideHardPlanets;

		public static float startEnemySpawnCurve;

		public static float midEnemySpawnCurve;

		public static float endEnemySpawnCurve;

		public static float ShyGuyPowerLevel;

		public Config(ConfigFile cfg)
		{
			InitInstance(this);
			AppearsConfig = cfg.Bind<bool>("General", "Enable the Shy Guy", true, "Allows the Shy Guy to spawn in-game.");
			HasGlowingEyesConfig = cfg.Bind<bool>("Appearance", "Glowing Eyes", true, "Gives the Shy Guy glowing eyes similar to the Bracken/Flowerman.");
			BloodyTextureConfig = cfg.Bind<bool>("Appearance", "Bloody Texture", false, "Gives the Shy Guy his bloodier, original texture from SCP: Containment Breach.");
			DeathMakesBloodyConfig = cfg.Bind<bool>("Appearance", "Bloody Death", true, "Causes the Shy Guy's material to become bloody once getting his first kill. Useless if Bloody Texture is enabled lol");
			DisableSpawnRatesConfig = cfg.Bind<bool>("General", "Disable Spawn Patches", false, "Disable Spawn Rate Patching. Only use this if you use another mod to alter Spawn Rates like LethalLevelLoader.");
			SoundPackConfig = cfg.Bind<string>("Appearance", "Sound Pack (Curated, SCPCB, SCPCBOld, SecretLab)", "Curated", "Determines the sounds the Shy Guy uses. (SOME MAY NOT SYNC WELL WITH TRIGGER TIME) (Curated = Default, curated for the Lethal Company experience) (SCPCB = SCP-096 sounds from SCP: Containment Breach) (SCPCBOld = Old alpha SCP-096 sounds from SCP: Containment Breach) (SecretLab = SCP-096 sounds from SCP: Secret Laboratory)");
			SpeedDocileMultiplierConfig = cfg.Bind<float>("Values", "Speed Multiplier (Docile)", 1f, "Determines the speed multiplier of the Shy Guy while docile.");
			SpeedRageMultiplierConfig = cfg.Bind<float>("Values", "Speed Multiplier (Rage)", 1f, "Determines the speed multiplier of the Shy Guy while enraged.");
			SpawnRarityConfig = cfg.Bind<int>("Values", "Spawn Rarity", 15, "Determines the spawn weight of the Shy Guy. Higher weights mean the Shy Guy is more likely appear. (just dont set this astronomically high)");
			TriggerTimeConfig = cfg.Bind<float>("Values.Triggering", "Trigger Time", 66.4f, "Determines how long the Shy Guy must remain in the Triggered state to become fully enraged.");
			FaceTriggerRangeConfig = cfg.Bind<float>("Values.Triggering", "Face Trigger Range", 17.5f, "Determines the face's trigger radius.");
			FaceTriggerGracePeriodConfig = cfg.Bind<float>("Values.Triggering", "Face Trigger Grace Period", 0.5f, "Determines the grace period when you see the face of the Shy Guy before he becomes enraged.");
			HasMaxTargetsConfig = cfg.Bind<bool>("Values.Triggering", "Has Max Targets", false, "Determines if the Shy Guy has a maximum amount of targets.");
			MaxTargetsConfig = cfg.Bind<int>("Values.Triggering", "Max Targets", 32, "Determines the max amount of targets the Shy Guy can have. (requires HasMaxTargets)");
			CanExitFacilityConfig = cfg.Bind<bool>("Values.Triggering", "Can Exit Facility", true, "Determines if the Shy Guy can exit the facility and into the outdoors (and vice versa) to attack its target.");
			MaxSpawnCountConfig = cfg.Bind<int>("Values.Spawning", "Max Spawn Count", 1, "Determines how many Shy Guy can spawn total.");
			CanSpawnOutsideConfig = cfg.Bind<bool>("Values.Spawning", "Can Spawn Outside", true, "Determines if the Shy Guy can spawn outside. ");
			SpawnOutsideHardPlanetsConfig = cfg.Bind<bool>("Values.Spawning", "Spawn Outside Only Hard Moons", true, "If set to true, the Shy Guy will only spawn outside on the highest-difficulty/modded moons.");
			StartEnemySpawnCurveConfig = cfg.Bind<float>("Values.Spawning", "Start Spawn Curve", 0.2f, "Spawn curve for the Shy Guy when the day starts. (typically 0-1)");
			MidEnemySpawnCurveConfig = cfg.Bind<float>("Values.Spawning", "Midday Spawn Curve", 1f, "Spawn curve for the Shy Guy midday. (typically 0-1)");
			EndEnemySpawnCurveConfig = cfg.Bind<float>("Values.Spawning", "End of Day Spawn Curve", 0.75f, "Spawn curve for the Shy Guy at the end of day. (typically 0-1)");
			ShyGuyPowerLevelConfig = cfg.Bind<float>("Values.Spawning", "Shy Guy Power Level", 3f, "Default Power Level for the Shy Guy to take up per level. (Default: 3.0)");
			appears = AppearsConfig.Value;
			hasGlowingEyes = HasGlowingEyesConfig.Value;
			bloodyTexture = BloodyTextureConfig.Value;
			deathMakesBloody = DeathMakesBloodyConfig.Value;
			DisableSpawnRates = DisableSpawnRatesConfig.Value;
			soundPack = SoundPackConfig.Value;
			speedDocileMultiplier = SpeedDocileMultiplierConfig.Value;
			speedRageMultiplier = SpeedRageMultiplierConfig.Value;
			spawnRarity = SpawnRarityConfig.Value;
			triggerTime = TriggerTimeConfig.Value;
			faceTriggerRange = FaceTriggerRangeConfig.Value;
			faceTriggerGracePeriod = FaceTriggerGracePeriodConfig.Value;
			hasMaxTargets = HasMaxTargetsConfig.Value;
			maxTargets = MaxTargetsConfig.Value;
			canExitFacility = CanExitFacilityConfig.Value;
			maxSpawnCount = MaxSpawnCountConfig.Value;
			canSpawnOutside = CanSpawnOutsideConfig.Value;
			spawnOutsideHardPlanets = SpawnOutsideHardPlanetsConfig.Value;
			startEnemySpawnCurve = StartEnemySpawnCurveConfig.Value;
			midEnemySpawnCurve = MidEnemySpawnCurveConfig.Value;
			endEnemySpawnCurve = EndEnemySpawnCurveConfig.Value;
			ShyGuyPowerLevel = ShyGuyPowerLevelConfig.Value;
		}

		public static void RequestSync()
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			if (!SyncedInstance<Config>.IsClient)
			{
				return;
			}
			FastBufferWriter val = default(FastBufferWriter);
			((FastBufferWriter)(ref val))..ctor(SyncedInstance<Config>.IntSize, (Allocator)2, -1);
			try
			{
				SyncedInstance<Config>.MessageManager.SendNamedMessage("Scopophobia_OnRequestConfigSync", 0uL, val, (NetworkDelivery)3);
			}
			finally
			{
				((IDisposable)(FastBufferWriter)(ref val)).Dispose();
			}
		}

		public static void OnRequestSync(ulong clientId, FastBufferReader _)
		{
			//IL_0054: 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_0078: Unknown result type (might be due to invalid IL or missing references)
			if (!SyncedInstance<Config>.IsHost)
			{
				return;
			}
			Plugin.logger.LogInfo((object)$"Config sync request received from client: {clientId}");
			byte[] array = SyncedInstance<Config>.SerializeToBytes(SyncedInstance<Config>.Instance);
			int num = array.Length;
			FastBufferWriter val = default(FastBufferWriter);
			((FastBufferWriter)(ref val))..ctor(num + SyncedInstance<Config>.IntSize, (Allocator)2, -1);
			try
			{
				((FastBufferWriter)(ref val)).WriteValueSafe<int>(ref num, default(ForPrimitives));
				((FastBufferWriter)(ref val)).WriteBytesSafe(array, -1, 0);
				SyncedInstance<Config>.MessageManager.SendNamedMessage("Scopophobia_OnReceiveConfigSync", clientId, val, (NetworkDelivery)3);
			}
			catch (Exception arg)
			{
				Plugin.logger.LogInfo((object)$"Error occurred syncing config with client: {clientId}\n{arg}");
			}
			finally
			{
				((IDisposable)(FastBufferWriter)(ref val)).Dispose();
			}
		}

		public static void OnReceiveSync(ulong _, FastBufferReader reader)
		{
			//IL_002d: 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)
			if (!((FastBufferReader)(ref reader)).TryBeginRead(SyncedInstance<Config>.IntSize))
			{
				Plugin.logger.LogError((object)"Config sync error: Could not begin reading buffer.");
				return;
			}
			int num = default(int);
			((FastBufferReader)(ref reader)).ReadValueSafe<int>(ref num, default(ForPrimitives));
			if (!((FastBufferReader)(ref reader)).TryBeginRead(num))
			{
				Plugin.logger.LogError((object)"Config sync error: Host could not sync.");
				return;
			}
			byte[] data = new byte[num];
			((FastBufferReader)(ref reader)).ReadBytesSafe(ref data, num, 0);
			SyncedInstance<Config>.SyncInstance(data);
			Plugin.logger.LogInfo((object)"Successfully synced config with host.");
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")]
		public static void InitializeLocalPlayer()
		{
			//IL_0062: 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: Expected O, but got Unknown
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Expected O, but got Unknown
			if (SyncedInstance<Config>.IsHost)
			{
				CustomMessagingManager messageManager = SyncedInstance<Config>.MessageManager;
				object obj = <>O.<0>__OnRequestSync;
				if (obj == null)
				{
					HandleNamedMessageDelegate val = OnRequestSync;
					<>O.<0>__OnRequestSync = val;
					obj = (object)val;
				}
				messageManager.RegisterNamedMessageHandler("Scopophobia_OnRequestConfigSync", (HandleNamedMessageDelegate)obj);
				SyncedInstance<Config>.Synced = true;
				return;
			}
			SyncedInstance<Config>.Synced = false;
			CustomMessagingManager messageManager2 = SyncedInstance<Config>.MessageManager;
			object obj2 = <>O.<1>__OnReceiveSync;
			if (obj2 == null)
			{
				HandleNamedMessageDelegate val2 = OnReceiveSync;
				<>O.<1>__OnReceiveSync = val2;
				obj2 = (object)val2;
			}
			messageManager2.RegisterNamedMessageHandler("Scopophobia_OnReceiveConfigSync", (HandleNamedMessageDelegate)obj2);
			RequestSync();
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(GameNetworkManager), "StartDisconnect")]
		public static void PlayerLeave()
		{
			SyncedInstance<Config>.RevertSync();
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "Scopophobia";

		public const string PLUGIN_NAME = "Scopophobia";

		public const string PLUGIN_VERSION = "1.1.5";
	}
	[BepInPlugin("Scopophobia", "Scopophobia", "1.1.5")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class ScopophobiaPlugin : BaseUnityPlugin
	{
		private readonly Harmony harmony = new Harmony("Scopophobia");

		public static EnemyType shyGuy;

		public static AssetBundle Assets;

		public static SpawnableEnemyWithRarity maskedPrefab;

		public static ManualLogSource logger;

		public static SpawnableEnemyWithRarity shyPrefab;

		public static Config MyConfig { get; internal set; }

		internal Assembly assembly => Assembly.GetExecutingAssembly();

		internal string GetFilePath(string path)
		{
			return assembly.Location.Replace(assembly.GetName().Name + ".dll", path);
		}

		private void LoadAssets()
		{
			try
			{
				Assets = AssetBundle.LoadFromFile(GetFilePath("scp096"));
			}
			catch (Exception arg)
			{
				logger.LogError((object)$"Failed to load asset bundle! {arg}");
			}
		}

		private void Awake()
		{
			harmony.PatchAll(typeof(Config));
			LoadAssets();
			logger = ((BaseUnityPlugin)this).Logger;
			MyConfig = new Config(((BaseUnityPlugin)this).Config);
			ConfigEntry<bool> val = default(ConfigEntry<bool>);
			((BaseUnityPlugin)this).Config.TryGetEntry<bool>("General", "Enable the Shy Guy", ref val);
			if (!val.Value)
			{
				return;
			}
			ConfigEntry<int> val2 = default(ConfigEntry<int>);
			((BaseUnityPlugin)this).Config.TryGetEntry<int>("Values", "Spawn Rarity", ref val2);
			int num = val2?.Value ?? 15;
			shyGuy = Assets.LoadAsset<EnemyType>("ShyGuyDef.asset");
			TerminalNode val3 = Assets.LoadAsset<TerminalNode>("ShyGuyTerminal.asset");
			TerminalKeyword val4 = Assets.LoadAsset<TerminalKeyword>("ShyGuyKeyword.asset");
			NetworkPrefabs.RegisterNetworkPrefab(shyGuy.enemyPrefab);
			Enemies.RegisterEnemy(shyGuy, num, (LevelTypes)(-1), (SpawnType)0, val3, val4);
			Type[] types = Assembly.GetExecutingAssembly().GetTypes();
			Type[] array = types;
			Type[] array2 = array;
			foreach (Type type in array2)
			{
				MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
				MethodInfo[] array3 = methods;
				MethodInfo[] array4 = array3;
				foreach (MethodInfo methodInfo in array4)
				{
					object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
					if (customAttributes.Length != 0)
					{
						methodInfo.Invoke(null, null);
					}
				}
			}
			logger.LogInfo((object)"Scopophobia | SCP-096 has entered the facility. All remaining personnel proceed with caution.");
			harmony.PatchAll(typeof(Plugin));
			harmony.PatchAll(typeof(GetShyGuyPrefabForLaterUse));
			if (Config.DisableSpawnRates)
			{
				logger.LogInfo((object)"Spawn Settings are disabled in Config. Shy guy will NOT spawn unless you use another mod like Lethal Quantities.");
			}
			else
			{
				harmony.PatchAll(typeof(ShyGuySpawnSettings));
			}
		}
	}
}
namespace Scopophobia.Patches
{
	[HarmonyPatch]
	internal class GetShyGuyPrefabForLaterUse
	{
		[HarmonyPatch(typeof(Terminal), "Start")]
		[HarmonyPostfix]
		private static void SavesPrefabForLaterUse(ref SelectableLevel[] ___moonsCatalogueList)
		{
			SelectableLevel[] array = ___moonsCatalogueList;
			SelectableLevel[] array2 = array;
			SelectableLevel[] array3 = array2;
			foreach (SelectableLevel val in array3)
			{
				foreach (SpawnableEnemyWithRarity enemy in val.Enemies)
				{
					if (enemy.enemyType.enemyName.ToLower() == "shy guy")
					{
						ScopophobiaPlugin.shyPrefab = enemy;
					}
				}
			}
		}
	}
}
namespace Scopophobia.NetcodePatcher
{
	[AttributeUsage(AttributeTargets.Module)]
	internal class NetcodePatchedAssemblyAttribute : Attribute
	{
	}
}