Decompiled source of TheThing v1.0.6

TheThing.dll

Decompiled 2 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using GameNetcodeStuff;
using LethalConfig;
using LethalConfig.ConfigItems;
using LethalConfig.ConfigItems.Options;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using StaticNetcodeLib;
using TheThing.Scripts;
using TheThing.Utils;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Rendering.HighDefinition;

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

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace TheThing
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency("evaisa.lethallib", "0.15.1")]
	[BepInPlugin("wexop.the_thing", "TheThing", "1.0.6")]
	public class TheThingPlugin : BaseUnityPlugin
	{
		private const string GUID = "wexop.the_thing";

		private const string NAME = "TheThing";

		private const string VERSION = "1.0.6";

		public GameObject roomObject;

		public GameObject actualRoomObjectInstantiated;

		public ThingRoomManager actualRoomObjectManager;

		public Dictionary<int, LightInformation> lightsInUse = new Dictionary<int, LightInformation>();

		public static TheThingPlugin instance;

		public ConfigEntry<string> spawnMoonRarity;

		public ConfigEntry<int> maxSeePlayerCount;

		public ConfigEntry<float> timeBetweenTeleport;

		public ConfigEntry<float> minDistanceBetweenPlayerToTeleport;

		public ConfigEntry<float> TimeToEscapeRoom;

		public ConfigEntry<int> monsterToHitToEscapeRoom;

		public ConfigEntry<float> enemyPower;

		public ConfigEntry<float> roomFogDistance;

		public ConfigEntry<float> roomPosY;

		private void Awake()
		{
			instance = this;
			((BaseUnityPlugin)this).Logger.LogInfo((object)"TheThing starting....");
			string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "thing");
			AssetBundle bundle = AssetBundle.LoadFromFile(text);
			((BaseUnityPlugin)this).Logger.LogInfo((object)"TheThing bundle found !");
			LoadConfigs();
			RegisterMonster(bundle);
			LoadRoom(bundle);
			((BaseUnityPlugin)this).Logger.LogInfo((object)"TheThing is ready!");
		}

		private void LoadConfigs()
		{
			spawnMoonRarity = ((BaseUnityPlugin)this).Config.Bind<string>("General", "SpawnRarity", "Modded:40,ExperimentationLevel:20,AssuranceLevel:20,VowLevel:20,OffenseLevel:25,MarchLevel:25,RendLevel:30,DineLevel:30,TitanLevel:40,Adamance:35,Embrion:40,Artifice:45", "Chance for thing to spawn for any moon, example => assurance:100,offense:50 . You need to restart the game.");
			CreateStringConfig(spawnMoonRarity, requireRestart: true);
			enemyPower = ((BaseUnityPlugin)this).Config.Bind<float>("General", "EnemyPower", 2f, "Enemy power for Thing monster. You need to restart the game.");
			CreateFloatConfig(enemyPower, 0f, 10f);
			maxSeePlayerCount = ((BaseUnityPlugin)this).Config.Bind<int>("Behavior", "MaxSeePlayerCount", 4, "Max player see by the monster before teleporting him into his room. No need to restart the game !");
			CreateIntConfig(maxSeePlayerCount);
			timeBetweenTeleport = ((BaseUnityPlugin)this).Config.Bind<float>("Behavior", "timeBetweenTeleport", 20f, "Time to wait before teleport to another place after the thing see a player. No need to restart the game !");
			CreateFloatConfig(timeBetweenTeleport);
			minDistanceBetweenPlayerToTeleport = ((BaseUnityPlugin)this).Config.Bind<float>("Behavior", "minDistanceBetweenPlayerToTeleport", 45f, "Minimum distance to have with any player to teleport somewhere to wait. No need to restart the game !");
			CreateFloatConfig(minDistanceBetweenPlayerToTeleport);
			monsterToHitToEscapeRoom = ((BaseUnityPlugin)this).Config.Bind<int>("Behavior", "MonsterToHitToEscapeRoom", 2, "Monsters to hit to escape the room. No need to restart the game !");
			CreateIntConfig(monsterToHitToEscapeRoom);
			roomFogDistance = ((BaseUnityPlugin)this).Config.Bind<float>("RoomSettings", "roomFogDistance", 5f, "Thing room fog distance. No need to restart the game !");
			CreateFloatConfig(roomFogDistance);
			TimeToEscapeRoom = ((BaseUnityPlugin)this).Config.Bind<float>("RoomSettings", "TimeToEscapeRoom", 90f, "Time to escape the room. No need to restart the game !");
			CreateFloatConfig(TimeToEscapeRoom, 0f, 300f);
			roomPosY = ((BaseUnityPlugin)this).Config.Bind<float>("RoomSettings", "roomPosY", 550f, "Room Y position. No need to restart the game !");
			CreateFloatConfig(roomPosY, 0f, 3000f);
		}

		private void RegisterMonster(AssetBundle bundle)
		{
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Expected O, but got Unknown
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Expected O, but got Unknown
			EnemyType val = bundle.LoadAsset<EnemyType>("Assets/LethalCompany/Mods/ThingMonster/Thing.asset");
			((BaseUnityPlugin)this).Logger.LogInfo((object)(((Object)val).name + " FOUND"));
			((BaseUnityPlugin)this).Logger.LogInfo((object)$"{val.enemyPrefab} prefab");
			NetworkPrefabs.RegisterNetworkPrefab(val.enemyPrefab);
			Utilities.FixMixerGroups(val.enemyPrefab);
			TerminalNode val2 = new TerminalNode();
			val2.creatureName = "Thing";
			val2.displayText = "";
			TerminalKeyword val3 = new TerminalKeyword();
			val3.word = "Thing";
			RegisterUtil.RegisterEnemyWithConfig(spawnMoonRarity.Value, val, val2, val3, instance.enemyPower.Value, val.MaxCount);
		}

		private void LoadRoom(AssetBundle bundle)
		{
			GameObject val = (roomObject = bundle.LoadAsset<GameObject>("Assets/LethalCompany/Mods/ThingMonster/ThingRoom.prefab"));
			((BaseUnityPlugin)this).Logger.LogInfo((object)(((Object)val).name + " FOUND"));
			Utilities.FixMixerGroups(val);
		}

		public void InstantiateRoom()
		{
			//IL_000f: 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_0025: Unknown result type (might be due to invalid IL or missing references)
			DestroyRoom();
			actualRoomObjectInstantiated = Object.Instantiate<GameObject>(roomObject, Vector3.up * (0f - roomPosY.Value), Quaternion.identity);
			actualRoomObjectManager = actualRoomObjectInstantiated.GetComponent<ThingRoomManager>();
		}

		public void DestroyRoom()
		{
			if ((Object)(object)actualRoomObjectInstantiated != (Object)null)
			{
				Object.Destroy((Object)(object)actualRoomObjectInstantiated);
				Object.Destroy((Object)(object)actualRoomObjectManager);
				actualRoomObjectManager = null;
				actualRoomObjectInstantiated = null;
			}
		}

		private void CreateFloatConfig(ConfigEntry<float> configEntry, float min = 0f, float max = 100f)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Expected O, but got Unknown
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Expected O, but got Unknown
			FloatSliderOptions val = new FloatSliderOptions();
			((BaseRangeOptions<float>)val).Min = min;
			((BaseRangeOptions<float>)val).Max = max;
			((BaseOptions)val).RequiresRestart = false;
			FloatSliderConfigItem val2 = new FloatSliderConfigItem(configEntry, val);
			LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val2);
		}

		private void CreateIntConfig(ConfigEntry<int> configEntry, int min = 0, int max = 100)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Expected O, but got Unknown
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Expected O, but got Unknown
			IntSliderOptions val = new IntSliderOptions();
			((BaseRangeOptions<int>)val).Min = min;
			((BaseRangeOptions<int>)val).Max = max;
			((BaseOptions)val).RequiresRestart = false;
			IntSliderConfigItem val2 = new IntSliderConfigItem(configEntry, val);
			LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val2);
		}

		private void CreateStringConfig(ConfigEntry<string> configEntry, bool requireRestart = false)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Expected O, but got Unknown
			TextInputFieldConfigItem val = new TextInputFieldConfigItem(configEntry, new TextInputFieldOptions
			{
				RequiresRestart = requireRestart
			});
			LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val);
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "TheThing";

		public const string PLUGIN_NAME = "TheThing";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace TheThing.Utils
{
	public class RegisterUtil
	{
		public static void RegisterEnemyWithConfig(string configMoonRarity, EnemyType enemy, TerminalNode terminalNode, TerminalKeyword terminalKeyword, float powerLevel, int spawnCount)
		{
			enemy.MaxCount = spawnCount;
			enemy.PowerLevel = powerLevel;
			var (dictionary, dictionary2) = ConfigParsing(configMoonRarity);
			Enemies.RegisterEnemy(enemy, dictionary, dictionary2, terminalNode, terminalKeyword);
		}

		public static void RegisterScrapWithConfig(string configMoonRarity, Item scrap)
		{
			var (dictionary, dictionary2) = ConfigParsing(configMoonRarity);
			Items.RegisterScrap(scrap, dictionary, dictionary2);
		}

		public static void RegisterShopItemWithConfig(bool enabledScrap, Item item, TerminalNode terminalNode, int itemCost, string configMoonRarity)
		{
			Items.RegisterShopItem(item, (TerminalNode)null, (TerminalNode)null, terminalNode, itemCost);
			if (enabledScrap)
			{
				RegisterScrapWithConfig(configMoonRarity, item);
			}
		}

		public static (Dictionary<LevelTypes, int> spawnRateByLevelType, Dictionary<string, int> spawnRateByCustomLevelType) ConfigParsing(string configMoonRarity)
		{
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			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 = item.Split(':');
				if (array.Length != 2)
				{
					continue;
				}
				string text = array[0];
				if (!int.TryParse(array[1], out var result))
				{
					continue;
				}
				if (Enum.TryParse<LevelTypes>(text, ignoreCase: true, out LevelTypes result2))
				{
					dictionary[result2] = result;
					continue;
				}
				string value = text + "Level";
				if (Enum.TryParse<LevelTypes>(value, ignoreCase: true, out result2))
				{
					dictionary[result2] = result;
				}
				else
				{
					dictionary2[text] = result;
				}
			}
			return (dictionary, dictionary2);
		}
	}
}
namespace TheThing.Scripts
{
	public class EscapeRoomObject : MonoBehaviour, IHittable
	{
		private static readonly int Disapear = Animator.StringToHash("disappear");

		public Animator animator;

		public AudioSource AudioSource;

		public AudioClip onHitSound;

		public int id;

		public ThingRoomManager thingRoomManager;

		private bool alreadyHit = false;

		public bool Hit(int force, Vector3 hitDirection, PlayerControllerB playerWhoHit = null, bool playHitSFX = false, int hitID = -1)
		{
			if (alreadyHit)
			{
				return true;
			}
			animator.SetTrigger(Disapear);
			thingRoomManager.OnHitEscapeObject(id);
			alreadyHit = true;
			((Behaviour)((Component)this).GetComponentInChildren<Light>()).enabled = false;
			AudioSource.PlayOneShot(onHitSound);
			return true;
		}
	}
	public class LightInformation
	{
		public Light Light;

		public Color color;

		public float intensity;

		public FlashlightItem flashlightItem;
	}
	[StaticNetcode]
	public class NetworkThing
	{
		public static ThingEnemyAI GetThingEnemyAI(ulong networkId)
		{
			List<ThingEnemyAI> list = Object.FindObjectsByType<ThingEnemyAI>((FindObjectsSortMode)0).ToList();
			ThingEnemyAI thingEnemyAI = list.Find((ThingEnemyAI e) => ((NetworkBehaviour)e).NetworkObjectId == networkId);
			if ((Object)(object)thingEnemyAI == (Object)null)
			{
				Debug.LogError((object)$"ROLLER BALL NOT FOUND {networkId}");
				return null;
			}
			return thingEnemyAI;
		}

		[ServerRpc]
		public static void SetPlayerIdServerRpc(ulong networkId, ulong playerId)
		{
			SetPlayerIdClientRpc(networkId, playerId);
		}

		[ClientRpc]
		public static void SetPlayerIdClientRpc(ulong networkId, ulong playerId)
		{
			ThingEnemyAI thingEnemyAI = GetThingEnemyAI(networkId);
			if (Object.op_Implicit((Object)(object)thingEnemyAI))
			{
				thingEnemyAI.OnSetPlayerId(playerId);
			}
		}

		[ServerRpc]
		public static void EnableEscapeObjectServerRpc(int id)
		{
			EnableEscapeObjectClientRpc(id);
		}

		[ClientRpc]
		public static void EnableEscapeObjectClientRpc(int id)
		{
			TheThingPlugin.instance.actualRoomObjectManager.EnableEscapeObject(id);
		}

		[ServerRpc]
		public static void EscapeRoomServerRpc()
		{
			EscapeRoomClientRpc();
		}

		[ClientRpc]
		public static void EscapeRoomClientRpc()
		{
			((MonoBehaviour)TheThingPlugin.instance.actualRoomObjectManager).StartCoroutine(TheThingPlugin.instance.actualRoomObjectManager.OnEscaped());
		}
	}
	public class ThingEnemyAI : EnemyAI
	{
		private static readonly int Idle = Animator.StringToHash("idle");

		private static readonly int Jumpscare = Animator.StringToHash("jumpscare");

		public GameObject headObject;

		public GameObject modelObject;

		public Light redLight;

		public AudioClip seePlayerSound;

		public AudioClip scaryAmbiantSound;

		public AudioClip JumpscareSound;

		public float aiInterval;

		public int lastBehaviorState;

		public ulong lastPlayerIdToKill;

		private PlayerControllerB playerToKIll = null;

		private List<LightInformation> lights = new List<LightInformation>();

		public bool playerToKillIsLocal;

		private Vector3 positionJumpScare;

		private bool _isActive;

		private bool _shouldResetLights;

		private bool _shouldTpToPlayer;

		private int _sawPlayerCount;

		private float _lightAnimationDuration = 3f;

		private float _lightAnimationTimer;

		private int _lastNodeIndex;

		private float _timeBetweenTeleport = 10f;

		private float _teleportTimer;

		private float _notSeePlayerTimer;

		private float _changePositionSeePlayerDuration = 45f;

		public override void Start()
		{
			((EnemyAI)this).Start();
			AllClientOnSwitchBehaviorState();
			ActivateMonster(active: false);
			base.agent.speed = 0f;
			base.debugEnemyAI = true;
			_timeBetweenTeleport = TheThingPlugin.instance.timeBetweenTeleport.Value;
		}

		public override void EnableEnemyMesh(bool enable, bool overrideDoNotSet = false)
		{
		}

		public override void OnSyncPositionFromServer(Vector3 pos)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			((Component)this).transform.position = pos;
		}

		public override void Update()
		{
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			aiInterval -= Time.deltaTime;
			_lightAnimationTimer -= Time.deltaTime;
			_teleportTimer -= Time.deltaTime;
			if (base.currentBehaviourStateIndex == 1)
			{
				_notSeePlayerTimer -= Time.deltaTime;
			}
			if (lastBehaviorState != base.currentBehaviourStateIndex)
			{
				lastBehaviorState = base.currentBehaviourStateIndex;
				AllClientOnSwitchBehaviorState();
			}
			if (base.currentBehaviourStateIndex == 2 && GameNetworkManager.Instance.localPlayerController.HasLineOfSightToPosition(((Component)this).transform.position + Vector3.up * 0.25f, 100f, 60, -1f))
			{
				GameNetworkManager.Instance.localPlayerController.JumpToFearLevel(0.8f, true);
			}
			if (_lightAnimationTimer < -0.5f && _shouldResetLights)
			{
				ResetLights();
				_shouldResetLights = false;
			}
			if (aiInterval <= 0f && ((NetworkBehaviour)this).IsOwner)
			{
				aiInterval = base.AIIntervalTime;
				((EnemyAI)this).DoAIInterval();
			}
		}

		private void LateUpdate()
		{
			//IL_0099: 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_0149: 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_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_017e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0183: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0192: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			if (base.currentBehaviourStateIndex == 2 && _lightAnimationTimer > -0.5f)
			{
				lights.ForEach(delegate(LightInformation l)
				{
					//IL_0061: Unknown result type (might be due to invalid IL or missing references)
					//IL_0067: Unknown result type (might be due to invalid IL or missing references)
					//IL_007e: Unknown result type (might be due to invalid IL or missing references)
					//IL_0084: Unknown result type (might be due to invalid IL or missing references)
					float num = Math.Clamp(_lightAnimationTimer, 0f, _lightAnimationDuration) / _lightAnimationDuration;
					if (num < 0.2f)
					{
						num = 0f;
					}
					l.Light.intensity = num * l.intensity;
					if (Object.op_Implicit((Object)(object)l.flashlightItem))
					{
						l.flashlightItem.flashlightBulb.color = l.color * num;
						l.flashlightItem.flashlightBulbGlow.color = l.color * num;
					}
				});
			}
			if (base.currentBehaviourStateIndex == 1 && !Object.op_Implicit((Object)(object)base.targetPlayer))
			{
				PlayerControllerB closestPlayer = ((EnemyAI)this).GetClosestPlayer(false, false, false);
				if (Object.op_Implicit((Object)(object)closestPlayer))
				{
					((Component)this).transform.LookAt(((Component)closestPlayer.gameplayCamera).transform);
					((Component)this).transform.eulerAngles = new Vector3(0f, ((Component)this).transform.eulerAngles.y, 0f);
				}
			}
			if (base.currentBehaviourStateIndex == 4 && Object.op_Implicit((Object)(object)base.targetPlayer))
			{
				if (playerToKillIsLocal)
				{
					PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
					((Component)localPlayerController.gameplayCamera).transform.eulerAngles = new Vector3(0f, ((Component)localPlayerController.gameplayCamera).transform.eulerAngles.y, ((Component)localPlayerController.gameplayCamera).transform.eulerAngles.z);
				}
				positionJumpScare = ((Component)base.targetPlayer.gameplayCamera).transform.position + ((Component)base.targetPlayer.gameplayCamera).transform.forward * 1.4f;
				((Component)this).transform.position = positionJumpScare - Vector3.up * 2.5f;
				((Component)this).transform.LookAt(((Component)base.targetPlayer.gameplayCamera).transform);
				((Component)this).transform.eulerAngles = new Vector3(0f, ((Component)this).transform.eulerAngles.y, 0f);
			}
		}

		public override void DoAIInterval()
		{
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			((EnemyAI)this).SyncPositionToClients();
			switch (base.currentBehaviourStateIndex)
			{
			case 0:
				if (!_isActive && _teleportTimer < 0f)
				{
					Vector3 randomNodeObjectPos = GetRandomNodeObjectPos();
					if (CheckIfPlayerAreInRange(randomNodeObjectPos))
					{
						_notSeePlayerTimer = _changePositionSeePlayerDuration;
						((Component)this).transform.position = randomNodeObjectPos;
						((EnemyAI)this).SyncPositionToClients();
						((EnemyAI)this).SwitchToBehaviourState(1);
					}
				}
				break;
			case 1:
				((EnemyAI)this).TargetClosestPlayer(1.5f, true, 70f);
				if (_notSeePlayerTimer < 0f)
				{
					((EnemyAI)this).SwitchToBehaviourState(0);
				}
				if (!((Object)(object)base.targetPlayer == (Object)null) && ((EnemyAI)this).PlayerIsTargetable(base.targetPlayer, false, false))
				{
					NetworkThing.SetPlayerIdServerRpc(((NetworkBehaviour)this).NetworkObjectId, base.targetPlayer.actualClientId);
					_sawPlayerCount++;
					_teleportTimer = _timeBetweenTeleport;
					((EnemyAI)this).SwitchToBehaviourState(2);
				}
				break;
			case 2:
				if (_lightAnimationTimer <= 0.5f)
				{
					((EnemyAI)this).SwitchToBehaviourState((_sawPlayerCount >= TheThingPlugin.instance.maxSeePlayerCount.Value) ? 3 : 0);
				}
				break;
			case 3:
				break;
			case 4:
				break;
			}
		}

		public void AllClientOnSwitchBehaviorState()
		{
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_01af: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
			base.creatureAnimator.SetBool(Jumpscare, false);
			((Behaviour)redLight).enabled = false;
			((Behaviour)base.agent).enabled = base.currentBehaviourStateIndex != 4;
			switch (base.currentBehaviourStateIndex)
			{
			case 0:
				base.targetPlayer = null;
				ActivateMonster(active: false);
				_shouldTpToPlayer = false;
				break;
			case 1:
				ActivateMonster(active: true);
				base.creatureAnimator.SetBool(Idle, true);
				break;
			case 2:
				base.creatureSFX.PlayOneShot(seePlayerSound);
				_lightAnimationTimer = _lightAnimationDuration;
				_shouldResetLights = true;
				GetLightsClose();
				break;
			case 3:
				ActivateMonster(active: false);
				TheThingPlugin.instance.InstantiateRoom();
				TheThingPlugin.instance.actualRoomObjectManager.ThingEnemyAI = this;
				SpawnShovel();
				if (Object.op_Implicit((Object)(object)base.targetPlayer))
				{
					((MonoBehaviour)this).StartCoroutine(DropItemsAndTeleportPlayer());
				}
				TheThingPlugin.instance.actualRoomObjectManager.OnPlayerSpawnIntoRoom();
				break;
			case 4:
				_sawPlayerCount = 0;
				ActivateMonster(active: true);
				((Behaviour)redLight).enabled = true;
				((MonoBehaviour)this).StartCoroutine(JumpScareAnimation());
				base.creatureAnimator.SetBool(Jumpscare, true);
				base.creatureSFX.PlayOneShot(JumpscareSound);
				positionJumpScare = ((Component)base.targetPlayer.gameplayCamera).transform.position + ((Component)base.targetPlayer.gameplayCamera).transform.forward * 1.4f;
				if (playerToKillIsLocal)
				{
					PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
					localPlayerController.JumpToFearLevel(0.9f, true);
					localPlayerController.disableMoveInput = true;
					localPlayerController.disableLookInput = true;
					localPlayerController.disableInteract = true;
				}
				break;
			}
		}

		public void OnSetPlayerId(ulong playerId)
		{
			lastPlayerIdToKill = playerId;
			base.targetPlayer = StartOfRound.Instance.allPlayerScripts.ToList().Find((PlayerControllerB p) => p.actualClientId == playerId);
		}

		private IEnumerator DropItemsAndTeleportPlayer()
		{
			if (base.targetPlayer.playerClientId == GameNetworkManager.Instance.localPlayerController.playerClientId)
			{
				playerToKillIsLocal = true;
			}
			if (playerToKillIsLocal)
			{
				GameNetworkManager.Instance.localPlayerController.DropAllHeldItemsAndSync();
			}
			yield return (object)new WaitForSeconds(0.3f);
			((Component)base.targetPlayer).transform.position = TheThingPlugin.instance.actualRoomObjectInstantiated.transform.position + new Vector3(1f, 1f, 0f);
			if (playerToKillIsLocal)
			{
				PlayerControllerB player = GameNetworkManager.Instance.localPlayerController;
				((Component)player).transform.position = TheThingPlugin.instance.actualRoomObjectInstantiated.transform.position + new Vector3(1f, 1f, 0f);
			}
		}

		private IEnumerator JumpScareAnimation()
		{
			yield return (object)new WaitForSeconds(2f);
			if (playerToKillIsLocal)
			{
				GameNetworkManager.Instance.localPlayerController.KillPlayer(Vector3.zero, true, (CauseOfDeath)8, 0, default(Vector3));
				CancelPlayerEffects();
			}
			base.targetPlayer = null;
			playerToKillIsLocal = false;
			playerToKIll = null;
			_teleportTimer = _timeBetweenTeleport;
			if (((NetworkBehaviour)this).IsOwner)
			{
				Vector3 pos = GetRandomNodeObjectPos();
				((Component)this).transform.position = pos;
				((EnemyAI)this).SwitchToBehaviourState(0);
			}
			((MonoBehaviour)this).StartCoroutine(DestroyRoom());
		}

		private IEnumerator DestroyRoom()
		{
			yield return (object)new WaitForSeconds(2f);
			TheThingPlugin.instance.DestroyRoom();
		}

		public void MonsterAttackPlayer()
		{
			Debug.Log((object)"MONSTER ATTACK");
			if (Object.op_Implicit((Object)(object)base.targetPlayer) && base.targetPlayer.isPlayerDead)
			{
				((EnemyAI)this).SwitchToBehaviourState(0);
			}
			_shouldTpToPlayer = true;
			((EnemyAI)this).SwitchToBehaviourServerRpc(4);
		}

		public void CancelMonsterAttack()
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			_sawPlayerCount = 0;
			if (playerToKillIsLocal)
			{
				PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
				((Component)localPlayerController).transform.position = StartOfRound.Instance.insideShipPositions[0].position;
			}
			base.targetPlayer = null;
			playerToKillIsLocal = false;
			playerToKIll = null;
			_teleportTimer = _timeBetweenTeleport;
			if (((NetworkBehaviour)this).IsOwner)
			{
				Vector3 randomNodeObjectPos = GetRandomNodeObjectPos();
				((Component)this).transform.position = randomNodeObjectPos;
				((EnemyAI)this).SwitchToBehaviourState(0);
			}
			try
			{
				((MonoBehaviour)this).StartCoroutine(DestroyRoom());
				((MonoBehaviour)this).StopCoroutine(JumpScareAnimation());
			}
			catch
			{
			}
		}

		private void CancelPlayerEffects()
		{
			if (playerToKillIsLocal)
			{
				PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
				localPlayerController.disableMoveInput = false;
				localPlayerController.disableLookInput = false;
				localPlayerController.disableInteract = false;
			}
		}

		private void ActivateMonster(bool active)
		{
			_isActive = active;
			modelObject.SetActive(active);
		}

		private Vector3 GetRandomNodeObjectPos()
		{
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: 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_0058: Unknown result type (might be due to invalid IL or missing references)
			if (base.allAINodes.Length != 0)
			{
				int num;
				for (num = Random.Range(0, base.allAINodes.Length); num == _lastNodeIndex; num = Random.Range(0, base.allAINodes.Length))
				{
				}
				lastBehaviorState = num;
				return base.allAINodes[num].transform.position;
			}
			return ((Component)this).transform.position;
		}

		private bool CheckIfPlayerAreInRange(Vector3 position)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			bool result = true;
			StartOfRound.Instance.allPlayerScripts.ToList().ForEach(delegate(PlayerControllerB p)
			{
				//IL_000c: 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)
				if (Vector3.Distance(((Component)p.gameplayCamera).transform.position, position) < TheThingPlugin.instance.minDistanceBetweenPlayerToTeleport.Value)
				{
					result = false;
				}
			});
			return result;
		}

		private void ResetLights()
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			foreach (LightInformation light in lights)
			{
				if (Object.op_Implicit((Object)(object)light.Light))
				{
					light.Light.intensity = light.intensity;
				}
				if (Object.op_Implicit((Object)(object)light.flashlightItem))
				{
					light.Light.color = light.color;
				}
			}
		}

		private void GetLightsClose()
		{
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			lights.Clear();
			List<Light> list = Object.FindObjectsByType<Light>((FindObjectsInactive)1, (FindObjectsSortMode)0).ToList().FindAll((Light light) => Vector3.Distance(((Component)light).transform.position, ((Component)this).transform.position) < 30f && Object.op_Implicit((Object)(object)light));
			foreach (Light item in list)
			{
				if (!((Object)(object)((Component)item).GetComponentInParent<animatedSun>() != (Object)null) && !(((Object)item).name == "NightVision") && !((Object)item).name.Contains("Spot Light") && !((Object)item).name.Contains("RedLight") && !((Object)item).name.Contains("RadarCamNightVision"))
				{
					FlashlightItem componentInParent = ((Component)item).GetComponentInParent<FlashlightItem>();
					LightInformation lightInformation = new LightInformation();
					lightInformation.Light = item;
					lightInformation.color = item.color;
					lightInformation.intensity = item.intensity;
					lightInformation.flashlightItem = componentInParent;
					lights.Add(lightInformation);
				}
			}
		}

		public void SpawnShovel()
		{
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			if (!((NetworkBehaviour)this).IsServer)
			{
				return;
			}
			GameObject shovel = null;
			((NetworkBehaviour)this).NetworkManager.NetworkConfig.Prefabs.NetworkPrefabsLists?.ForEach(delegate(NetworkPrefabsList list)
			{
				list.PrefabList?.ToList().ForEach(delegate(NetworkPrefab prefab)
				{
					GrabbableObject component = prefab.Prefab.GetComponent<GrabbableObject>();
					if ((Object)(object)component != (Object)null && component.itemProperties.itemName == "Shovel")
					{
						shovel = prefab.Prefab;
					}
				});
			});
			GameObject val = Object.Instantiate<GameObject>(shovel, TheThingPlugin.instance.actualRoomObjectInstantiated.transform);
			val.transform.localPosition = TheThingPlugin.instance.actualRoomObjectManager.shovelPosition;
			val.GetComponent<NetworkObject>().Spawn(false);
		}

		public override void OnCollideWithPlayer(Collider other)
		{
			PlayerControllerB component = ((Component)other).gameObject.GetComponent<PlayerControllerB>();
			if ((Object)(object)component != (Object)null && component.actualClientId == GameNetworkManager.Instance.localPlayerController.actualClientId)
			{
				base.targetPlayer = GameNetworkManager.Instance.localPlayerController;
				playerToKillIsLocal = true;
				NetworkThing.SetPlayerIdServerRpc(((NetworkBehaviour)this).NetworkObjectId, base.targetPlayer.actualClientId);
				MonsterAttackPlayer();
			}
		}
	}
	public class ThingRoomManager : MonoBehaviour
	{
		public AudioSource ambientSource;

		public AudioClip welcomeSound;

		public AudioClip scaryAmbientSound;

		public Vector3 shovelPosition;

		public List<LightInformation> lights = new List<LightInformation>();

		public List<EscapeRoomObject> EscapeRoomObjects = new List<EscapeRoomObject>();

		public List<int> escapeRoomNumbersHit = new List<int>();

		public LocalVolumetricFog localVolumetricFog;

		public ThingEnemyAI ThingEnemyAI;

		private LightInformation _playerNightVision;

		private float _lightAnimationsTimer;

		private float _scaryAmbientAnimationTimer = 90f;

		private bool _scarySoundPlayed;

		private bool _hasEscaped;

		private int escapeObjectToHit = 2;

		private int escapeObjectHitCount;

		public void Start()
		{
			_scaryAmbientAnimationTimer = TheThingPlugin.instance.TimeToEscapeRoom.Value - 22f;
			escapeObjectToHit = TheThingPlugin.instance.monsterToHitToEscapeRoom.Value;
			localVolumetricFog.parameters.meanFreePath = TheThingPlugin.instance.roomFogDistance.Value;
		}

		public void OnPlayerSpawnIntoRoom()
		{
			ambientSource.PlayOneShot(welcomeSound);
			GetAllLights();
			DisableEveryEscapeObject();
			EnableRandomEscapeObject(0);
		}

		public void DisableEveryEscapeObject()
		{
			int i = 0;
			EscapeRoomObjects.ForEach(delegate(EscapeRoomObject o)
			{
				o.id = i;
				i++;
				((Component)o).gameObject.SetActive(false);
			});
		}

		public void Update()
		{
			_lightAnimationsTimer -= Time.deltaTime;
			_scaryAmbientAnimationTimer -= Time.deltaTime;
			if (_lightAnimationsTimer < 0f && _scaryAmbientAnimationTimer >= 0f)
			{
				_lightAnimationsTimer = Random.Range(4, 7);
				((MonoBehaviour)this).StartCoroutine(LightAnimation());
			}
			if (_scaryAmbientAnimationTimer < 0f && !_scarySoundPlayed && escapeObjectHitCount < escapeObjectToHit)
			{
				_scarySoundPlayed = true;
				ambientSource.PlayOneShot(scaryAmbientSound);
				((MonoBehaviour)this).StartCoroutine(OnScaryAmbientRunned());
			}
			if (Object.op_Implicit((Object)(object)ThingEnemyAI) && ThingEnemyAI.playerToKillIsLocal && GameNetworkManager.Instance.localPlayerController.isPlayerDead && !_hasEscaped)
			{
				_hasEscaped = true;
				NetworkThing.EscapeRoomServerRpc();
			}
		}

		private IEnumerator OnScaryAmbientRunned()
		{
			yield return (object)new WaitForSeconds(22f);
			GetAllLights();
			LightsManagement(active: false, lights);
			DisableEveryEscapeObject();
			ambientSource.PlayOneShot(welcomeSound);
			if (Object.op_Implicit((Object)(object)ThingEnemyAI) && ThingEnemyAI.playerToKillIsLocal)
			{
				GameNetworkManager.Instance.localPlayerController.JumpToFearLevel(0.8f, true);
			}
			yield return (object)new WaitForSeconds(4f);
			if (Object.op_Implicit((Object)(object)ThingEnemyAI))
			{
				ThingEnemyAI.MonsterAttackPlayer();
			}
			lights.Clear();
			((MonoBehaviour)this).StopCoroutine(LightAnimation());
		}

		private IEnumerator LightAnimation()
		{
			if (lights.Count <= 0 || !Object.op_Implicit((Object)(object)lights?[0].Light))
			{
				yield return null;
			}
			List<LightInformation> lightsAnimated = new List<LightInformation>();
			lights.ForEach(delegate(LightInformation l)
			{
				if (Random.Range(0, 3) == 0)
				{
					lightsAnimated.Add(l);
				}
			});
			LightsManagement(active: false, lightsAnimated);
			yield return (object)new WaitForSeconds(0.5f);
			LightsManagement(active: true, lightsAnimated);
			yield return (object)new WaitForSeconds(0.5f);
			LightsManagement(active: false, lightsAnimated);
			yield return (object)new WaitForSeconds(0.8f);
			LightsManagement(active: true, lightsAnimated);
			yield return (object)new WaitForSeconds(0.2f);
			LightsManagement(active: false, lightsAnimated);
			yield return (object)new WaitForSeconds(1f);
			LightsManagement(active: true, lightsAnimated);
		}

		public Color GetRandomRedColor()
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			return new Color(Random.Range(0.3f, 0.75f), 0f, 0f, 1f);
		}

		public void LightsManagement(bool active, List<LightInformation> lightsInfos)
		{
			lightsInfos.ForEach(delegate(LightInformation l)
			{
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				//IL_001f: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)l.Light != (Object)null)
				{
					l.Light.color = (active ? GetRandomRedColor() : Color.black);
				}
			});
		}

		public void GetAllLights()
		{
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			lights.Clear();
			List<Light> list = Object.FindObjectsByType<Light>((FindObjectsInactive)1, (FindObjectsSortMode)0).ToList().FindAll((Light light) => Vector3.Distance(((Component)light).transform.position, ((Component)this).transform.position) < 150f && Vector3.Distance(new Vector3(0f, ((Component)light).transform.position.y, 0f), new Vector3(0f, ((Component)this).transform.position.y, 0f)) < 25f && Object.op_Implicit((Object)(object)light));
			foreach (Light item in list)
			{
				if (!((Object)(object)((Component)item).GetComponentInParent<animatedSun>() != (Object)null) && !(((Object)((Component)item).transform.parent).name == "HelmetLights") && !((Object)(object)item == (Object)(object)ThingEnemyAI.redLight) && !((Object)((Component)item).transform.parent).name.Contains("EscapeObject") && !((Object)item).name.Contains("Spot Light") && !((Object)item).name.Contains("RedLight") && !((Object)item).name.Contains("RadarCamNightVision") && !((Object)item).name.Contains("Near") && !((Object)item).name.Contains("VisorCamera") && !((Object)item).name.Contains("MainCamera"))
				{
					FlashlightItem componentInParent = ((Component)item).GetComponentInParent<FlashlightItem>();
					LightInformation lightInformation = new LightInformation();
					lightInformation.Light = item;
					lightInformation.color = item.color;
					lightInformation.intensity = item.intensity;
					lightInformation.flashlightItem = componentInParent;
					if (((Object)item).name == "NightVision")
					{
						_playerNightVision = lightInformation;
					}
					else
					{
						lights.Add(lightInformation);
					}
				}
			}
		}

		public void EnableRandomEscapeObject(int notId)
		{
			if (ThingEnemyAI.playerToKillIsLocal)
			{
				int num = Random.Range(0, EscapeRoomObjects.Count);
				while (num == notId || escapeRoomNumbersHit.Contains(num))
				{
					num = Random.Range(0, EscapeRoomObjects.Count);
				}
				NetworkThing.EnableEscapeObjectServerRpc(num);
				escapeRoomNumbersHit.Add(num);
			}
		}

		public void EnableEscapeObject(int id)
		{
			((Component)EscapeRoomObjects[id]).gameObject.SetActive(true);
		}

		public IEnumerator OnEscaped()
		{
			_hasEscaped = true;
			((MonoBehaviour)this).StopCoroutine(LightAnimation());
			((MonoBehaviour)this).StopCoroutine(OnScaryAmbientRunned());
			LightsManagement(active: false, lights);
			ambientSource.PlayOneShot(welcomeSound);
			yield return (object)new WaitForSeconds(4f);
			if (Object.op_Implicit((Object)(object)ThingEnemyAI))
			{
				ThingEnemyAI.CancelMonsterAttack();
			}
		}

		public void OnHitEscapeObject(int id)
		{
			escapeObjectHitCount++;
			if (escapeObjectHitCount == escapeObjectToHit)
			{
				NetworkThing.EscapeRoomServerRpc();
			}
			else
			{
				EnableRandomEscapeObject(id);
			}
		}
	}
}