Decompiled source of HeavyItemSCPs v1.3.2

HeavyItemSCPs/ProjectSCP.HeavyItemSCPs.dll

Decompiled a month 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.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using HeavyItemSCPs;
using HeavyItemSCPs.Items.SCP178;
using HeavyItemSCPs.Items.SCP323;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using ProjectSCP.HeavyItemSCPs.NetcodePatcher;
using SCP500;
using SCPItems;
using Unity.Netcode;
using Unity.Netcode.Components;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
using WearableItemsAPI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("AmazingAssets.TerrainToMesh")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: IgnoresAccessChecksTo("ClientNetworkTransform")]
[assembly: IgnoresAccessChecksTo("DissonanceVoip")]
[assembly: IgnoresAccessChecksTo("Facepunch Transport for Netcode for GameObjects")]
[assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")]
[assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")]
[assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging")]
[assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging.DocCodeExamples")]
[assembly: IgnoresAccessChecksTo("Unity.Burst")]
[assembly: IgnoresAccessChecksTo("Unity.Burst.Unsafe")]
[assembly: IgnoresAccessChecksTo("Unity.Collections")]
[assembly: IgnoresAccessChecksTo("Unity.Collections.LowLevel.ILSupport")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")]
[assembly: IgnoresAccessChecksTo("Unity.Jobs")]
[assembly: IgnoresAccessChecksTo("Unity.Mathematics")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.Common")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.MetricTypes")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStats")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Component")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Configuration")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Implementation")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsReporting")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkProfiler.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkSolutionInterface")]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Components")]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.Networking.Transport")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Csg")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.KdTree")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Poly2Tri")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Stl")]
[assembly: IgnoresAccessChecksTo("Unity.Profiling.Core")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Config.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Authentication")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Analytics")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Configuration")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Device")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments.Internal")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Internal")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Networking")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Registration")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Scheduler")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Telemetry")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Threading")]
[assembly: IgnoresAccessChecksTo("Unity.Services.QoS")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Relay")]
[assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")]
[assembly: IgnoresAccessChecksTo("Unity.Timeline")]
[assembly: IgnoresAccessChecksTo("Unity.VisualEffectGraph.Runtime")]
[assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.UI")]
[assembly: AssemblyCompany("ProjectSCP.HeavyItemSCPs")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.3.2.0")]
[assembly: AssemblyInformationalVersion("1.3.2+b41b18e93d35d966248a70e9ff478e36381c7fc8")]
[assembly: AssemblyProduct("HeavyItemSCPs")]
[assembly: AssemblyTitle("ProjectSCP.HeavyItemSCPs")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.3.2.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
[module: NetcodePatchedAssembly]
internal class <Module>
{
	static <Module>()
	{
	}
}
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

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

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

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

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace SCPItems
{
	internal class SCP500Compatibility
	{
		private static readonly ManualLogSource logger = Plugin.LoggerInstance;

		private static bool? _enabled;

		internal static bool enabled
		{
			get
			{
				if (!_enabled.HasValue)
				{
					_enabled = Chainloader.PluginInfos.ContainsKey("ProjectSCP.SCP500");
				}
				return _enabled.Value;
			}
		}

		internal static bool IsLocalPlayerAffectedBySCP500
		{
			get
			{
				if (Plugin.config427_500Compatibility.Value && enabled)
				{
					return LocalPlayerAffectedBySCP500();
				}
				return false;
			}
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		private static bool LocalPlayerAffectedBySCP500()
		{
			return SCP500Controller.LocalPlayerAffectedBySCP500;
		}
	}
}
namespace HeavyItemSCPs
{
	public class NetworkHandlerHeavy : NetworkBehaviour
	{
		private static ManualLogSource logger = Plugin.LoggerInstance;

		public Material OverlayMaterial = null;

		public static NetworkHandlerHeavy Instance { get; private set; }

		public static PlayerControllerB PlayerFromId(ulong id)
		{
			return StartOfRound.Instance.allPlayerScripts[StartOfRound.Instance.ClientPlayerList[id]];
		}

		public override void OnNetworkSpawn()
		{
			if ((NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer) && (Object)(object)Instance != (Object)null)
			{
				((Component)Instance).gameObject.GetComponent<NetworkObject>().Despawn(true);
				logger.LogDebug((object)"Despawned network object");
			}
			Instance = this;
			logger.LogDebug((object)"set instance to this");
			((NetworkBehaviour)this).OnNetworkSpawn();
			logger.LogDebug((object)"base.OnNetworkSpawn");
		}

		[ServerRpc(RequireOwnership = false)]
		public void ShakePlayerCamerasServerRpc(ScreenShakeType type, float distance, Vector3 position)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_011e: 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)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1415843425u, val, (RpcDelivery)0);
					((FastBufferWriter)(ref val2)).WriteValueSafe<ScreenShakeType>(ref type, default(ForEnums));
					((FastBufferWriter)(ref val2)).WriteValueSafe<float>(ref distance, default(ForPrimitives));
					((FastBufferWriter)(ref val2)).WriteValueSafe(ref position);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1415843425u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost) && (NetworkManager.Singleton.IsServer || NetworkManager.Singleton.IsHost))
				{
					ShakePlayerCamerasClientRpc(type, distance, position);
				}
			}
		}

		[ClientRpc]
		private void ShakePlayerCamerasClientRpc(ScreenShakeType type, float distance, Vector3 position)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: Invalid comparison between Unknown and I4
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
			{
				ClientRpcParams val = default(ClientRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1861719679u, val, (RpcDelivery)0);
				((FastBufferWriter)(ref val2)).WriteValueSafe<ScreenShakeType>(ref type, default(ForEnums));
				((FastBufferWriter)(ref val2)).WriteValueSafe<float>(ref distance, default(ForPrimitives));
				((FastBufferWriter)(ref val2)).WriteValueSafe(ref position);
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1861719679u, val, (RpcDelivery)0);
			}
			if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
			{
				float num = Vector3.Distance(((Component)Plugin.localPlayer).transform.position, position);
				if (num < distance)
				{
					HUDManager.Instance.ShakeCamera(type);
				}
				else if (num < distance * 2f && type - 1 >= 0)
				{
					HUDManager.Instance.ShakeCamera((ScreenShakeType)(type - 1));
				}
			}
		}

		[ClientRpc]
		private void GrabObjectClientRpc(ulong id, ulong clientId)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_0173: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1468826189u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, id);
					BytePacker.WriteValueBitPacked(val2, clientId);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1468826189u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost) && clientId == Plugin.localPlayer.actualClientId && Plugin.localPlayer.ItemSlots.Where((GrabbableObject x) => (Object)(object)x == (Object)null).Any())
				{
					GrabbableObject component = ((Component)NetworkManager.Singleton.SpawnManager.SpawnedObjects[id]).gameObject.GetComponent<GrabbableObject>();
					logger.LogDebug((object)$"Grabbing item with weight: {component.itemProperties.weight}");
					Plugin.localPlayer.GrabObjectServerRpc(NetworkObjectReference.op_Implicit(((NetworkBehaviour)component).NetworkObject));
					component.parentObject = Plugin.localPlayer.localItemHolder;
					component.GrabItemOnClient();
				}
			}
		}

		[ClientRpc]
		private void ChangePlayerSizeClientRpc(ulong clientId, float size)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1830337413u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, clientId);
					((FastBufferWriter)(ref val2)).WriteValueSafe<float>(ref size, default(ForPrimitives));
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1830337413u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					PlayerControllerB val3 = StartOfRound.Instance.allPlayerScripts[StartOfRound.Instance.ClientPlayerList[clientId]];
					val3.thisPlayerBody.localScale = new Vector3(size, size, size);
				}
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void ChangePlayerSizeServerRpc(ulong clientId, float size)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(4004502649u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, clientId);
					((FastBufferWriter)(ref val2)).WriteValueSafe<float>(ref size, default(ForPrimitives));
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 4004502649u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost) && (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer))
				{
					ChangePlayerSizeClientRpc(clientId, size);
				}
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void SpawnEnemyServerRpc(string enemyName, Vector3 pos = default(Vector3), int yRot = 0, bool outsideEnemy = false)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: 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_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_024a: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				ServerRpcParams val = default(ServerRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(2896122965u, val, (RpcDelivery)0);
				bool flag = enemyName != null;
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives));
				if (flag)
				{
					((FastBufferWriter)(ref val2)).WriteValueSafe(enemyName, false);
				}
				((FastBufferWriter)(ref val2)).WriteValueSafe(ref pos);
				BytePacker.WriteValueBitPacked(val2, yRot);
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref outsideEnemy, default(ForPrimitives));
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2896122965u, val, (RpcDelivery)0);
			}
			if ((int)base.__rpc_exec_stage != 1 || (!networkManager.IsServer && !networkManager.IsHost))
			{
				return;
			}
			string enemyName2 = enemyName;
			if (!NetworkManager.Singleton.IsHost && !NetworkManager.Singleton.IsServer)
			{
				return;
			}
			SpawnableEnemyWithRarity val3 = RoundManager.Instance.currentLevel.Enemies.Where((SpawnableEnemyWithRarity x) => x.enemyType.enemyName == enemyName2).FirstOrDefault();
			if (val3 == null)
			{
				logger.LogError((object)("Error: Couldnt get " + enemyName2 + " to spawn"));
				return;
			}
			int num = RoundManager.Instance.currentLevel.Enemies.IndexOf(val3);
			if (pos != default(Vector3))
			{
				RoundManager.Instance.SpawnEnemyOnServer(pos, (float)yRot, num);
				if (outsideEnemy)
				{
					EnemyAI val4 = RoundManager.Instance.SpawnedEnemies.Last();
					val4.SetEnemyOutside(true);
				}
			}
			else if (outsideEnemy)
			{
				GameObject[] outsideAINodes = RoundManager.Instance.outsideAINodes;
				int num2 = Random.Range(0, outsideAINodes.Length - 1);
				RoundManager.Instance.SpawnEnemyOnServer(outsideAINodes[num2].transform.position, (float)yRot, num);
			}
			else
			{
				List<EnemyVent> list = RoundManager.Instance.allEnemyVents.ToList();
				logger.LogDebug((object)("Found vents: " + list.Count));
				EnemyVent val5 = list[Random.Range(0, list.Count - 1)];
				logger.LogDebug((object)("Selected vent: " + (object)val5));
				val5.enemyTypeIndex = num;
				val5.enemyType = val3.enemyType;
				logger.LogDebug((object)("Updated vent with enemy type index: " + val5.enemyTypeIndex + " and enemy type: " + (object)val5.enemyType));
				RoundManager.Instance.SpawnEnemyFromVent(val5);
				logger.LogDebug((object)"Spawning SCP-956 from vent");
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void SpawnItemServerRpc(ulong clientId, string _itemName, int newValue, Vector3 pos, Quaternion rot, bool grabItem = false)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_0119: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				ServerRpcParams val = default(ServerRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1846456409u, val, (RpcDelivery)0);
				BytePacker.WriteValueBitPacked(val2, clientId);
				bool flag = _itemName != null;
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives));
				if (flag)
				{
					((FastBufferWriter)(ref val2)).WriteValueSafe(_itemName, false);
				}
				BytePacker.WriteValueBitPacked(val2, newValue);
				((FastBufferWriter)(ref val2)).WriteValueSafe(ref pos);
				((FastBufferWriter)(ref val2)).WriteValueSafe(ref rot);
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref grabItem, default(ForPrimitives));
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1846456409u, val, (RpcDelivery)0);
			}
			if ((int)base.__rpc_exec_stage != 1 || (!networkManager.IsServer && !networkManager.IsHost))
			{
				return;
			}
			string _itemName2 = _itemName;
			if (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer)
			{
				Item val3 = StartOfRound.Instance.allItemsList.itemsList.Where((Item x) => x.itemName == _itemName2).FirstOrDefault();
				logger.LogDebug((object)"Got item");
				GameObject val4 = Object.Instantiate<GameObject>(val3.spawnPrefab, pos, rot, StartOfRound.Instance.propsContainer);
				if (newValue != 0)
				{
					val4.GetComponent<GrabbableObject>().SetScrapValue(newValue);
				}
				logger.LogDebug((object)$"Spawning item with weight: {val4.GetComponent<GrabbableObject>().itemProperties.weight}");
				val4.GetComponent<NetworkObject>().Spawn(false);
				if (grabItem)
				{
					GrabObjectClientRpc(val4.GetComponent<NetworkObject>().NetworkObjectId, clientId);
					logger.LogDebug((object)"Grabbed obj");
				}
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void DespawnDeadPlayerServerRpc(ulong clientId)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				ServerRpcParams val = default(ServerRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1723845470u, val, (RpcDelivery)0);
				BytePacker.WriteValueBitPacked(val2, clientId);
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1723845470u, val, (RpcDelivery)0);
			}
			if ((int)base.__rpc_exec_stage != 1 || (!networkManager.IsServer && !networkManager.IsHost))
			{
				return;
			}
			ulong clientId2 = clientId;
			if (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer)
			{
				PlayerControllerB val3 = StartOfRound.Instance.allPlayerScripts.Where((PlayerControllerB x) => x.actualClientId == clientId2).FirstOrDefault();
				if (!((Object)(object)val3 == (Object)null))
				{
					Object.Destroy((Object)(object)((Component)val3.deadBody).gameObject);
				}
			}
		}

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

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_NetworkHandlerHeavy()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Expected O, but got Unknown
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Expected O, but got Unknown
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Expected O, but got Unknown
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(1415843425u, new RpcReceiveHandler(__rpc_handler_1415843425));
			NetworkManager.__rpc_func_table.Add(1861719679u, new RpcReceiveHandler(__rpc_handler_1861719679));
			NetworkManager.__rpc_func_table.Add(1468826189u, new RpcReceiveHandler(__rpc_handler_1468826189));
			NetworkManager.__rpc_func_table.Add(1830337413u, new RpcReceiveHandler(__rpc_handler_1830337413));
			NetworkManager.__rpc_func_table.Add(4004502649u, new RpcReceiveHandler(__rpc_handler_4004502649));
			NetworkManager.__rpc_func_table.Add(2896122965u, new RpcReceiveHandler(__rpc_handler_2896122965));
			NetworkManager.__rpc_func_table.Add(1846456409u, new RpcReceiveHandler(__rpc_handler_1846456409));
			NetworkManager.__rpc_func_table.Add(1723845470u, new RpcReceiveHandler(__rpc_handler_1723845470));
		}

		private static void __rpc_handler_1415843425(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: 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_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				ScreenShakeType type = default(ScreenShakeType);
				((FastBufferReader)(ref reader)).ReadValueSafe<ScreenShakeType>(ref type, default(ForEnums));
				float distance = default(float);
				((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref distance, default(ForPrimitives));
				Vector3 position = default(Vector3);
				((FastBufferReader)(ref reader)).ReadValueSafe(ref position);
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((NetworkHandlerHeavy)(object)target).ShakePlayerCamerasServerRpc(type, distance, position);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1861719679(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: 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_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				ScreenShakeType type = default(ScreenShakeType);
				((FastBufferReader)(ref reader)).ReadValueSafe<ScreenShakeType>(ref type, default(ForEnums));
				float distance = default(float);
				((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref distance, default(ForPrimitives));
				Vector3 position = default(Vector3);
				((FastBufferReader)(ref reader)).ReadValueSafe(ref position);
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((NetworkHandlerHeavy)(object)target).ShakePlayerCamerasClientRpc(type, distance, position);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

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

		private static void __rpc_handler_1830337413(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				ulong clientId = default(ulong);
				ByteUnpacker.ReadValueBitPacked(reader, ref clientId);
				float size = default(float);
				((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref size, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((NetworkHandlerHeavy)(object)target).ChangePlayerSizeClientRpc(clientId, size);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_4004502649(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				ulong clientId = default(ulong);
				ByteUnpacker.ReadValueBitPacked(reader, ref clientId);
				float size = default(float);
				((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref size, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((NetworkHandlerHeavy)(object)target).ChangePlayerSizeServerRpc(clientId, size);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_2896122965(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				bool flag = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives));
				string enemyName = null;
				if (flag)
				{
					((FastBufferReader)(ref reader)).ReadValueSafe(ref enemyName, false);
				}
				Vector3 pos = default(Vector3);
				((FastBufferReader)(ref reader)).ReadValueSafe(ref pos);
				int yRot = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref yRot);
				bool outsideEnemy = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref outsideEnemy, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((NetworkHandlerHeavy)(object)target).SpawnEnemyServerRpc(enemyName, pos, yRot, outsideEnemy);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1846456409(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				ulong clientId = default(ulong);
				ByteUnpacker.ReadValueBitPacked(reader, ref clientId);
				bool flag = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives));
				string itemName = null;
				if (flag)
				{
					((FastBufferReader)(ref reader)).ReadValueSafe(ref itemName, false);
				}
				int newValue = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref newValue);
				Vector3 pos = default(Vector3);
				((FastBufferReader)(ref reader)).ReadValueSafe(ref pos);
				Quaternion rot = default(Quaternion);
				((FastBufferReader)(ref reader)).ReadValueSafe(ref rot);
				bool grabItem = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref grabItem, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((NetworkHandlerHeavy)(object)target).SpawnItemServerRpc(clientId, itemName, newValue, pos, rot, grabItem);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1723845470(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				ulong clientId = default(ulong);
				ByteUnpacker.ReadValueBitPacked(reader, ref clientId);
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((NetworkHandlerHeavy)(object)target).DespawnDeadPlayerServerRpc(clientId);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		[MethodImpl(MethodImplOptions.NoInlining)]
		protected internal override string __getTypeName()
		{
			return "NetworkHandlerHeavy";
		}
	}
	[HarmonyPatch]
	public class NetworkObjectManager
	{
		private static GameObject networkPrefab;

		private static ManualLogSource logger = Plugin.LoggerInstance;

		[HarmonyPostfix]
		[HarmonyPatch(typeof(GameNetworkManager), "Start")]
		public static void Init()
		{
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Expected O, but got Unknown
			logger.LogDebug((object)"Initializing network prefab...");
			if (!((Object)(object)networkPrefab != (Object)null))
			{
				networkPrefab = (GameObject)Plugin.ModAssets.LoadAsset("Assets/ModAssets/SharedAssets/NetworkHandlerHeavyItemSCPs.prefab");
				logger.LogDebug((object)"Got networkPrefab");
				NetworkManager.Singleton.AddNetworkPrefab(networkPrefab);
				logger.LogDebug((object)"Added networkPrefab");
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(StartOfRound), "Awake")]
		private static void SpawnNetworkHandler()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			if (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer)
			{
				GameObject val = Object.Instantiate<GameObject>(networkPrefab, Vector3.zero, Quaternion.identity);
				logger.LogDebug((object)"Instantiated networkHandlerHost");
				val.GetComponent<NetworkObject>().Spawn(false);
				logger.LogDebug((object)"Spawned network object");
			}
		}
	}
	[BepInPlugin("ProjectSCP.HeavyItemSCPs", "HeavyItemSCPs", "1.3.2")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		public enum DropMethod
		{
			DropNothing,
			DropHeldItem,
			DropTwoHandedItem,
			DropAllItems
		}

		private const string PLUGIN_GUID = "ProjectSCP.HeavyItemSCPs";

		private const string PLUGIN_NAME = "HeavyItemSCPs";

		private const string PLUGIN_VERSION = "1.3.2";

		public static Plugin PluginInstance;

		public static ManualLogSource LoggerInstance;

		private readonly Harmony harmony = new Harmony("ProjectSCP.HeavyItemSCPs");

		public static AssetBundle? ModAssets;

		public static ConfigEntry<bool> configEnableSCP427;

		public static ConfigEntry<int> config427MinValue;

		public static ConfigEntry<int> config427MaxValue;

		public static ConfigEntry<string> config427LevelRarities;

		public static ConfigEntry<string> config427CustomLevelRarities;

		public static ConfigEntry<int> config427SCPDungeonRarity;

		public static ConfigEntry<float> configTimeToTransform;

		public static ConfigEntry<int> configHealthPerSecondOpen;

		public static ConfigEntry<float> configHoarderBugTransformTime;

		public static ConfigEntry<float> configBaboonHawkTransformTime;

		public static ConfigEntry<float> configOtherEnemyTransformTime;

		public static ConfigEntry<float> configTimeToSpawnSCP4271;

		public static ConfigEntry<int> configMaxSpawns;

		public static ConfigEntry<bool> config427_500Compatibility;

		public static ConfigEntry<string> config4271LevelRarities;

		public static ConfigEntry<string> config4271CustomLevelRarities;

		public static ConfigEntry<int> config4271SCPDungeonRarity;

		public static ConfigEntry<DropMethod> config4271DropMethod;

		public static ConfigEntry<int> config4271MaxHealth;

		public static ConfigEntry<bool> configEnableSCP178;

		public static ConfigEntry<int> config178MinValue;

		public static ConfigEntry<int> config178MaxValue;

		public static ConfigEntry<string> config178LevelRarities;

		public static ConfigEntry<string> config178CustomLevelRarities;

		public static ConfigEntry<int> config178SCPDungeonRarity;

		public static ConfigEntry<float> config178LensDistortion;

		public static ConfigEntry<float> config178ChromaticAberration;

		public static ConfigEntry<string> config178ColorTint;

		public static ConfigEntry<bool> config178SeeScrapThroughWalls;

		public static ConfigEntry<float> config178SeeScrapRange;

		public static ConfigEntry<int> config1781MaxCountInside;

		public static ConfigEntry<int> config1781MaxCountOutside;

		public static ConfigEntry<float> config1781RenderDistance;

		public static ConfigEntry<float> config1781DespawnTime;

		public static ConfigEntry<float> config1781WanderingWaitTime;

		public static ConfigEntry<float> config1781WanderingRadius;

		public static ConfigEntry<float> config1781PostObservationTime;

		public static ConfigEntry<float> config1781DistanceToAddAnger;

		public static ConfigEntry<float> config1781ObservationGracePeriod;

		public static ConfigEntry<bool> config1781UsePercentageBasedCount;

		public static ConfigEntry<float> config1781MaxPercentCountInside;

		public static ConfigEntry<float> config1781MaxPercentCountOutside;

		public static ConfigEntry<bool> configEnableSCP323;

		public static ConfigEntry<int> config323MinValue;

		public static ConfigEntry<int> config323MaxValue;

		public static ConfigEntry<string> config323LevelRarities;

		public static ConfigEntry<string> config323CustomLevelRarities;

		public static ConfigEntry<int> config323SCPDungeonRarity;

		public static ConfigEntry<float> config323DistanceToIncreaseInsanity;

		public static ConfigEntry<int> config323InsanityNearby;

		public static ConfigEntry<int> config323InsanityHolding;

		public static ConfigEntry<int> config323InsanityWearing;

		public static ConfigEntry<int> config323InsanityToTransform;

		public static ConfigEntry<bool> config323ShowInsanity;

		public static ConfigEntry<bool> config323BlurVisionWhenAddingInsanity;

		public static ConfigEntry<string> config3231LevelRarities;

		public static ConfigEntry<string> config3231CustomLevelRarities;

		public static ConfigEntry<int> config3231SCPDungeonRarity;

		public static ConfigEntry<float> config3231PlayerBloodSenseRange;

		public static ConfigEntry<float> config3231MaskedBloodSenseRange;

		public static ConfigEntry<float> config3231DoorBashForce;

		public static ConfigEntry<int> config3231DoorBashDamage;

		public static ConfigEntry<int> config3231DoorBashAOEDamage;

		public static ConfigEntry<float> config3231DoorBashAOERange;

		public static ConfigEntry<bool> config3231DespawnDoorAfterBash;

		public static ConfigEntry<float> config3231DespawnDoorAfterBashTime;

		public static ConfigEntry<int> config3231MaxHP;

		public static ConfigEntry<int> config3231MaxDamage;

		public static ConfigEntry<int> config3231MinDamage;

		public static ConfigEntry<bool> config3231ReverseDamage;

		public static ConfigEntry<float> config3231ChaseMaxSpeed;

		public static ConfigEntry<float> config3231RoamMaxSpeed;

		public static ConfigEntry<float> config3231RoamMinSpeed;

		public static ConfigEntry<float> config3231TimeToLosePlayer;

		public static ConfigEntry<float> config3231SearchAfterLosePlayerTime;

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

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

		private void Awake()
		{
			if ((Object)(object)PluginInstance == (Object)null)
			{
				PluginInstance = this;
			}
			LoggerInstance = ((BaseUnityPlugin)PluginInstance).Logger;
			harmony.PatchAll();
			InitializeNetworkBehaviours();
			configEnableSCP427 = ((BaseUnityPlugin)this).Config.Bind<bool>("SCP-427", "Enable SCP-427", true, "Whether or not SCP-427 can spawn as scrap.");
			config427MinValue = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-427", "Minimum value", 100, "The minimum value of SCP-427.");
			config427MaxValue = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-427", "Maximum value", 300, "The maximum value of SCP-427.");
			config427LevelRarities = ((BaseUnityPlugin)this).Config.Bind<string>("SCP-427 Rarities", "Level Rarities", "ExperimentationLevel:5, AssuranceLevel:7, VowLevel:10, OffenseLevel:15, AdamanceLevel:25, MarchLevel:15, RendLevel:30, DineLevel:35, TitanLevel:45, ArtificeLevel:25, EmbrionLevel:50, Modded:15", "Rarities for each level. See default for formatting.");
			config427CustomLevelRarities = ((BaseUnityPlugin)this).Config.Bind<string>("SCP-427 Rarities", "Custom Level Rarities", "Secret LabsLevel:50", "Rarities for modded levels. Same formatting as level rarities.");
			config427SCPDungeonRarity = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-427 Rarities", "SCP Dungeon Rarity", 100, "The rarity of SCP-427 in the SCP Dungeon. Set to -1 to use level rarities.");
			configTimeToTransform = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-427", "Time to transform", 30f, "How long a player can hold the necklace before they transform into SCP-427-1. Set to -1 to disable transforming.");
			configHealthPerSecondOpen = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-427", "Health per second open", 5, "The health gained per second while opening SCP-427.");
			configHoarderBugTransformTime = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-427", "Hoarder bug transform time", 5f, "The time it takes for the hoarder bug to transform into SCP-427-1. Set to -1 to disable transforming.");
			configBaboonHawkTransformTime = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-427", "Baboon hawk transform time", 5f, "The time it takes for the baboon hawk to transform into SCP-427-1. Set to -1 to disable transforming.");
			configOtherEnemyTransformTime = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-427", "Other enemy transform time", 10f, "The time it takes for the other enemies to transform into SCP-427-1. Set to -1 to disable transforming.");
			configTimeToSpawnSCP4271 = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-427", "Time to spawn SCP-427-1", 300f, "The time it takes for SCP-427 to spawn SCP-427-1 when on the ground. Set to -1 to disable spawning from necklace.");
			configMaxSpawns = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-427", "Max spawns", 1, "The maximum number of SCP-427-1 instances that can be spawned when SCP-427 is on the ground.");
			config427_500Compatibility = ((BaseUnityPlugin)this).Config.Bind<bool>("SCP-427", "SCP-500 compatibility", true, "Whether or not SCP-427 should be compatible with the SCP-500 mod. This will only work if you have the SCP-500 mod installed. If enabled, it will temporarily halt the transformation timer when holding or using SCP-427 when you take SCP-500.");
			config4271LevelRarities = ((BaseUnityPlugin)this).Config.Bind<string>("SCP-427-1 Rarities", "Level Rarities", "ExperimentationLevel:0, AssuranceLevel:0, VowLevel:0, OffenseLevel:0, AdamanceLevel:0, MarchLevel:0, RendLevel:0, DineLevel:0, TitanLevel:0, ArtificeLevel:0, EmbrionLevel:0, Modded:0", "Rarities for each level. See default for formatting.");
			config4271CustomLevelRarities = ((BaseUnityPlugin)this).Config.Bind<string>("SCP-427-1 Rarities", "Custom Level Rarities", "Secret LabsLevel:0", "Rarities for modded levels. Same formatting as level rarities.");
			config4271SCPDungeonRarity = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-427-1 Rarities", "SCP Dungeon Rarity", -1, "The rarity of SCP-427-1 in the SCP Dungeon. Set to -1 to use level rarities.");
			config4271DropMethod = ((BaseUnityPlugin)this).Config.Bind<DropMethod>("SCP-427-1", "Drop method", DropMethod.DropAllItems, "When the player is grabbed by SCP-427-1, they should drop: 0 = Drop nothing, 1 = Drop held item, 2 = Drop two-handed item, 3 = Drop all items.");
			config4271MaxHealth = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-427-1", "Max health", 50, "The maximum health of SCP-427-1.");
			configEnableSCP178 = ((BaseUnityPlugin)this).Config.Bind<bool>("SCP-178", "Enable SCP-178", true, "Whether or not SCP-178 can spawn as scrap.");
			config178MinValue = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-178", "Minimum value", 100, "The minimum value of SCP-178.");
			config178MaxValue = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-178", "Maximum value", 150, "The maximum value of SCP-178.");
			config178LevelRarities = ((BaseUnityPlugin)this).Config.Bind<string>("SCP-178 Rarities", "Level Rarities", "ExperimentationLevel:10, AssuranceLevel:15, VowLevel:15, OffenseLevel:20, AdamanceLevel:30, MarchLevel:20, RendLevel:50, DineLevel:55, TitanLevel:60, ArtificeLevel:60, EmbrionLevel:65, Modded:20", "Rarities for each level. See default for formatting.");
			config178CustomLevelRarities = ((BaseUnityPlugin)this).Config.Bind<string>("SCP-178 Rarities", "Custom Level Rarities", "Secret LabsLevel:75", "Rarities for modded levels. Same formatting as level rarities.");
			config178SCPDungeonRarity = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-178 Rarities", "SCP Dungeon Rarity", 100, "The rarity of SCP-178 in the SCP Dungeon. Set to -1 to use level rarities.");
			config178LensDistortion = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-178 3D Effects", "Lens Distortion", -0.2f, "Changes the lens distortion effect of the 3D glasses.");
			config178ChromaticAberration = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-178 3D Effects", "Chromatic Aberration", 3f, "Changes the chromatic aberration effect of the 3D glasses.");
			config178ColorTint = ((BaseUnityPlugin)this).Config.Bind<string>("SCP-178 3D Effects", "Color Tint", "500,0,500", "Changes the RGB color tint effect of the 3D glasses.");
			config178SeeScrapThroughWalls = ((BaseUnityPlugin)this).Config.Bind<bool>("SCP-178", "See Scrap Through Walls", true, "Changes whether or not the 3D glasses can allow you to see scrap through walls.");
			config178SeeScrapRange = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-178", "See Scrap Range", 50f, "Changes the range at which the 3D glasses can see scrap.");
			config1781MaxCountOutside = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-1781", "Max count outside", 50, "The maximum number of SCP-178-1 instances that can be spawned outside. -1 spawns on all ai nodes.");
			config1781MaxCountInside = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-1781", "Max count inside", 50, "The maximum number of SCP-178-1 instances that can be spawned inside. -1 spawns on all ai nodes.");
			config1781RenderDistance = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-1781", "Render distance", 30f, "The distance at which SCP-178-1 instances will run their AI. Any instances outside this distance will be disabled, still showing the model but not moving around. Lower values can help with performance. -1 disables this feature.");
			config1781DespawnTime = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-1781", "Despawn time", 30f, "The time it takes for SCP-178-1 instances to despawn when not wearing the glasses.");
			config1781PostObservationTime = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-1781", "Post observation time", 5f, "The time it takes for SCP-178-1 instances to return to their roaming phase after being stared at.");
			config1781WanderingRadius = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-1781", "Wandering radius", 5f, "The radius around SCP-178-1 spawn position that they will roam around in.");
			config1781WanderingWaitTime = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-1781", "Wandering wait time", 5f, "When spawned, SCP-178-1 will pick a random position in their wandering radius and walk to it. This determines how long they will wait until picking another position to walk to.");
			config1781DistanceToAddAnger = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-1781", "Distance to add anger", 10f, "The distance you need to be from SCP-178-1 to increase their anger meter when looking at them.");
			config1781ObservationGracePeriod = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-1781", "Observation grace period", 1f, "The time it takes for SCP-178-1 instances to start getting angry after staring at them.");
			config1781UsePercentageBasedCount = ((BaseUnityPlugin)this).Config.Bind<bool>("SCP-1781 Percentage Based", "Use percentage based count", true, "If true, when putting on the 3D glasses, instead of using max count, it will get the amount of AI nodes and times it by this value to get the amount of SCP-178-1 instances it should spawn.");
			config1781MaxPercentCountInside = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-1781 Percentage Based", "Max percent count inside", 0.5f, "The percentage of inside AI nodes that should have SCP-178-1 instances spawned on them.");
			config1781MaxPercentCountOutside = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-1781 Percentage Based", "Max percent count outside", 0.5f, "The percentage of outside AI nodes that should have SCP-178-1 instances spawned on them.");
			configEnableSCP323 = ((BaseUnityPlugin)this).Config.Bind<bool>("SCP-323", "Enable SCP-323", true, "Whether or not SCP-323 can spawn as scrap.");
			config323MinValue = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-323", "Minimum value", 100, "The minimum value of SCP-323.");
			config323MaxValue = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-323", "Maximum value", 150, "The maximum value of SCP-323.");
			config323LevelRarities = ((BaseUnityPlugin)this).Config.Bind<string>("SCP-323 Rarities", "Level Rarities", "ExperimentationLevel:5, AssuranceLevel:7, VowLevel:10, OffenseLevel:15, AdamanceLevel:25, MarchLevel:15, RendLevel:30, DineLevel:35, TitanLevel:45, ArtificeLevel:25, EmbrionLevel:50, Modded:15", "Rarities for each level. See default for formatting.");
			config323CustomLevelRarities = ((BaseUnityPlugin)this).Config.Bind<string>("SCP-323 Rarities", "Custom Level Rarities", "Secret LabsLevel:50", "Rarities for modded levels. Same formatting as level rarities.");
			config323SCPDungeonRarity = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-323 Rarities", "SCP Dungeon Rarity", 100, "The rarity in the SCP Dungeon. Set to -1 to use level rarities.");
			config323DistanceToIncreaseInsanity = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-323", "Distance to increase insanity", 10f, "The distance you need to be from SCP-323 for it to start decreasing your insanity.");
			config323InsanityNearby = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-323", "Insanity nearby", 5, "The amount of insanity you will gain every 10 seconds of being near SCP-323.");
			config323InsanityHolding = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-323", "Insanity holding", 10, "The amount of insanity you will gain every 10 seconds when you are holding SCP-323.");
			config323InsanityWearing = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-323", "Insanity wearing", 10, "The amount of insanity you will gain every 10 seconds when you are wearing SCP-323.");
			config323InsanityToTransform = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-323", "Insanity to transform", 50, "You will be forced to transform when you reach this insanity value. It cannot be stopped.");
			config323ShowInsanity = ((BaseUnityPlugin)this).Config.Bind<bool>("SCP-323", "Show insanity", false, "Blur the players vision when they are near SCP-323 based on their insanity.");
			config323BlurVisionWhenAddingInsanity = ((BaseUnityPlugin)this).Config.Bind<bool>("SCP-323", "Blur vision when adding insanity", true, "When adding sanity, the players vision will blur.");
			config3231LevelRarities = ((BaseUnityPlugin)this).Config.Bind<string>("SCP-323-1 Rarities", "Level Rarities", "ExperimentationLevel:0, AssuranceLevel:0, VowLevel:0, OffenseLevel:0, AdamanceLevel:0, MarchLevel:0, RendLevel:0, DineLevel:0, TitanLevel:0, ArtificeLevel:0, EmbrionLevel:0, Modded:0", "Rarities for each level. See default for formatting.");
			config3231CustomLevelRarities = ((BaseUnityPlugin)this).Config.Bind<string>("SCP-323-1 Rarities", "Custom Level Rarities", "Secret LabsLevel:0", "Rarities for modded levels. Same formatting as level rarities.");
			config3231SCPDungeonRarity = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-323-1 Rarities", "SCP Dungeon Rarity", -1, "The rarity in the SCP Dungeon. Set to -1 to use level rarities.");
			config3231PlayerBloodSenseRange = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-323-1", "Player blood sense range", 75f, "When the player takes damage, SCP-323-1 will enter BloodSearch phase if the player is in this range.");
			config3231MaskedBloodSenseRange = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-323-1", "Masked blood sense range", 75f, "When a masked enemy takes damage, SCP-323-1 will enter BloodSearch phase if a masked is in this range.");
			config3231DoorBashForce = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-323-1", "Door bash force", 35f, "The amount of force to apply to the door when SCP-323-1 bashes it.");
			config3231DoorBashDamage = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-323-1", "Door bash damage", 30, "The amount of damage the player will take if the door hits them.");
			config3231DoorBashAOEDamage = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-323-1", "Door bash AoE damage", 10, "The amount of damage the player will take if they are within range of the door when it is being bashed.");
			config3231DoorBashAOERange = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-323-1", "Door bash AoE range", 5f, "The range of the AoE damage.");
			config3231DespawnDoorAfterBash = ((BaseUnityPlugin)this).Config.Bind<bool>("SCP-323-1", "Despawn door after bash", true, "Whether the door should despawn after its been bashed.");
			config3231DespawnDoorAfterBashTime = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-323-1", "Despawn door after bash time", 3f, "The time it takes for the door to despawn after being bashed.");
			config3231MaxHP = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-323-1", "Max HP", 20, "The maximum amount of health SCP-323-1 can have.");
			config3231MaxDamage = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-323-1", "Max damage", 50, "The maximum amount of damage SCP-323-1 can deal.");
			config3231MinDamage = ((BaseUnityPlugin)this).Config.Bind<int>("SCP-323-1", "Min damage", 10, "The minimum amount of damage SCP-323-1 can deal.");
			config3231ReverseDamage = ((BaseUnityPlugin)this).Config.Bind<bool>("SCP-323-1", "Reverse damage", true, "When false, SCP-323-1 will do more damage the more health it has. When true, it will do more damage the less health it has.");
			config3231ChaseMaxSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-323-1", "Chase max speed", 8.5f, "The maximum speed at which SCP-323-1 will chase the player based on health.");
			config3231RoamMaxSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-323-1", "Roam max speed", 5f, "The maximum speed at which SCP-323-1 will roam based on health. This is also the min speed SCP-323-1 will roam at.");
			config3231RoamMinSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-323-1", "Roam min speed", 3f, "The minimum speed at which SCP-323-1 will roam based on health.");
			config3231TimeToLosePlayer = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-323-1", "Time to lose player", 5f, "The time the player needs to be out of LOS to lose SCP-323-1.");
			config3231SearchAfterLosePlayerTime = ((BaseUnityPlugin)this).Config.Bind<float>("SCP-323-1", "Search after lose player time", 25f, "The time it takes for SCP-323-1 to search after losing the player.");
			string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
			ModAssets = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), "heavy_assets"));
			if ((Object)(object)ModAssets == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)"Failed to load custom assets.");
				return;
			}
			LoggerInstance.LogDebug((object)("Got AssetBundle at: " + Path.Combine(directoryName, "heavy_assets")));
			if (configEnableSCP427.Value)
			{
				SCPItems.Load("Assets/ModAssets/SCP427/SCP427Item.asset", ObjectClass.Safe, config427LevelRarities.Value, config427CustomLevelRarities.Value, config427SCPDungeonRarity.Value, config427MinValue.Value, config427MaxValue.Value, tabletop: true, general: true, small: true);
				SCPItems.LoadEnemy("Assets/ModAssets/SCP427/SCP4271Enemy.asset", "Assets/ModAssets/SCP427/Bestiary/SCP4271TN.asset", "Assets/ModAssets/SCP427/Bestiary/SCP4271TK.asset", config4271LevelRarities.Value, config4271CustomLevelRarities.Value, config4271SCPDungeonRarity.Value);
			}
			if (configEnableSCP178.Value)
			{
				SCPItems.Load("Assets/ModAssets/SCP178/SCP178Item.asset", ObjectClass.Safe, config178LevelRarities.Value, config178CustomLevelRarities.Value, config178SCPDungeonRarity.Value, config178MinValue.Value, config178MaxValue.Value, tabletop: true, general: true);
				SCPItems.LoadEnemy("Assets/ModAssets/SCP178/SCP1781Enemy.asset", "Assets/ModAssets/SCP178/Bestiary/SCP1781TN.asset", "Assets/ModAssets/SCP178/Bestiary/SCP1781TK.asset", null, null, -1);
				SCP1783DVision.Load();
			}
			if (configEnableSCP323.Value)
			{
				SCPItems.Load("Assets/ModAssets/SCP323/SCP323Item.asset", ObjectClass.Safe, config323LevelRarities.Value, config323CustomLevelRarities.Value, config323SCPDungeonRarity.Value, config323MinValue.Value, config323MaxValue.Value);
				SCPItems.LoadEnemy("Assets/ModAssets/SCP323/SCP323_1Enemy.asset", "Assets/ModAssets/SCP323/Bestiary/SCP323_1TN.asset", "Assets/ModAssets/SCP323/Bestiary/SCP323_1TK.asset", config3231LevelRarities.Value, config3231CustomLevelRarities.Value, config3231SCPDungeonRarity.Value);
			}
			((BaseUnityPlugin)this).Logger.LogInfo((object)"ProjectSCP.HeavyItemSCPs v1.3.2 has loaded!");
		}

		public static Dictionary<LevelTypes, int>? GetLevelRarities(string? levelsString)
		{
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				Dictionary<LevelTypes, int> dictionary = new Dictionary<LevelTypes, int>();
				if (levelsString != null && levelsString != "")
				{
					string[] array = levelsString.Split(',');
					string[] array2 = array;
					foreach (string text in array2)
					{
						string[] array3 = text.Split(':');
						if (array3.Length == 2)
						{
							string text2 = array3[0].Trim();
							string text3 = array3[1].Trim();
							if (Enum.TryParse<LevelTypes>(text2, out LevelTypes result) && int.TryParse(text3, out var result2))
							{
								dictionary.Add(result, result2);
							}
							else
							{
								LoggerInstance.LogError((object)("Error: Invalid level rarity: " + text2 + ":" + text3));
							}
						}
					}
				}
				return dictionary;
			}
			catch (Exception arg)
			{
				LoggerInstance.LogError((object)$"Error: {arg}");
				return null;
			}
		}

		public static Dictionary<string, int>? GetCustomLevelRarities(string? levelsString)
		{
			try
			{
				Dictionary<string, int> dictionary = new Dictionary<string, int>();
				if (levelsString != null)
				{
					string[] array = levelsString.Split(',');
					string[] array2 = array;
					foreach (string text in array2)
					{
						string[] array3 = text.Split(':');
						if (array3.Length == 2)
						{
							string text2 = array3[0].Trim();
							string text3 = array3[1].Trim();
							if (int.TryParse(text3, out var result))
							{
								dictionary.Add(text2, result);
							}
							else
							{
								LoggerInstance.LogError((object)("Error: Invalid level rarity: " + text2 + ":" + text3));
							}
						}
					}
				}
				return dictionary;
			}
			catch (Exception arg)
			{
				LoggerInstance.LogError((object)$"Error: {arg}");
				return null;
			}
		}

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

		private static void InitializeNetworkBehaviours()
		{
			Type[] types = Assembly.GetExecutingAssembly().GetTypes();
			Type[] array = types;
			foreach (Type type in array)
			{
				MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
				MethodInfo[] array2 = methods;
				foreach (MethodInfo methodInfo in array2)
				{
					object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
					if (customAttributes.Length != 0)
					{
						methodInfo.Invoke(null, null);
					}
				}
			}
			LoggerInstance.LogDebug((object)"Finished initializing network behaviours");
		}
	}
	public static class SCPItems
	{
		public static List<SCPItem> SCPItemsList = new List<SCPItem>();

		public static List<SCPEnemy> SCPEnemiesList = new List<SCPEnemy>();

		public static void Load(string path, ObjectClass objClass, string? levelRarities = null, string? customLevelRarities = null, int scpDungeonRarity = 100, int minValue = 0, int maxValue = 0, bool tabletop = false, bool general = false, bool small = false)
		{
			Item val = Plugin.ModAssets.LoadAsset<Item>(path);
			if ((Object)(object)val == (Object)null)
			{
				Plugin.LoggerInstance.LogError((object)("Error: Couldnt get item with path " + path + " in assets"));
				return;
			}
			Plugin.LoggerInstance.LogDebug((object)("Got " + ((Object)val).name + " prefab"));
			val.minValue = minValue;
			val.maxValue = Mathf.Max(minValue, maxValue);
			SCPItem sCPItem = new SCPItem();
			sCPItem.item = val;
			sCPItem.scpDungeonRarity = scpDungeonRarity;
			sCPItem.ObjectClass = objClass;
			sCPItem.TabletopItem = tabletop;
			sCPItem.GeneralItem = general;
			sCPItem.SmallItem = small;
			SCPItemsList.Add(sCPItem);
			NetworkPrefabs.RegisterNetworkPrefab(val.spawnPrefab);
			Utilities.FixMixerGroups(val.spawnPrefab);
			Items.RegisterScrap(val, Plugin.GetLevelRarities(levelRarities), Plugin.GetCustomLevelRarities(customLevelRarities));
		}

		public static void LoadShopItem(string path, ObjectClass objClass, int price)
		{
			Item val = Plugin.ModAssets.LoadAsset<Item>(path);
			if ((Object)(object)val == (Object)null)
			{
				Plugin.LoggerInstance.LogError((object)("Error: Couldnt get item with path " + path + " from assets"));
				return;
			}
			Plugin.LoggerInstance.LogDebug((object)("Got " + ((Object)val).name + " prefab"));
			SCPItem sCPItem = new SCPItem();
			sCPItem.item = val;
			sCPItem.ObjectClass = objClass;
			sCPItem.price = price;
			SCPItemsList.Add(sCPItem);
			NetworkPrefabs.RegisterNetworkPrefab(val.spawnPrefab);
			Utilities.FixMixerGroups(val.spawnPrefab);
			Items.RegisterShopItem(val, price);
		}

		public static void LoadEnemy(string path, string TNPath, string TKPath, string? levelRarities = null, string? customLevelRarities = null, int scpDungeonRarity = 100, ObjectClass objClass = ObjectClass.Unknown)
		{
			EnemyType val = Plugin.ModAssets.LoadAsset<EnemyType>(path);
			if ((Object)(object)val == (Object)null)
			{
				Plugin.LoggerInstance.LogError((object)("Error: Couldnt get enemy with path " + path + " from assets"));
				return;
			}
			Plugin.LoggerInstance.LogDebug((object)("Got " + ((Object)val).name + " prefab"));
			if (levelRarities == null && customLevelRarities == null)
			{
				val.spawningDisabled = true;
			}
			TerminalNode val2 = Plugin.ModAssets.LoadAsset<TerminalNode>(TNPath);
			TerminalKeyword val3 = Plugin.ModAssets.LoadAsset<TerminalKeyword>(TKPath);
			if ((Object)(object)val2 == (Object)null)
			{
				Plugin.LoggerInstance.LogError((object)("Error: Couldnt get terminal node from path " + TNPath + " in assets"));
				return;
			}
			if ((Object)(object)val3 == (Object)null)
			{
				Plugin.LoggerInstance.LogError((object)("Error: Couldnt get terminal keyword from path " + TKPath + " in assets"));
				return;
			}
			SCPEnemy sCPEnemy = new SCPEnemy();
			sCPEnemy.ObjectClass = objClass;
			sCPEnemy.enemyType = val;
			sCPEnemy.SCPDungeonRarity = scpDungeonRarity;
			SCPEnemiesList.Add(sCPEnemy);
			Plugin.LoggerInstance.LogDebug((object)("Registering " + ((Object)val).name + " enemy network prefab..."));
			NetworkPrefabs.RegisterNetworkPrefab(val.enemyPrefab);
			Plugin.LoggerInstance.LogDebug((object)("Registering " + ((Object)val).name + " enemy..."));
			Enemies.RegisterEnemy(val, Plugin.GetLevelRarities(levelRarities), Plugin.GetCustomLevelRarities(customLevelRarities), val2, val3);
		}

		public static SCPItem? GetSCPItem(Item item)
		{
			foreach (SCPItem sCPItems in SCPItemsList)
			{
				if ((Object)(object)sCPItems.item.spawnPrefab == (Object)(object)item.spawnPrefab)
				{
					return sCPItems;
				}
			}
			return null;
		}
	}
	public class SCPEnemy
	{
		public ObjectClass ObjectClass;

		public EnemyType enemyType = null;

		public int SCPDungeonRarity;

		public int currentLevelRarity;

		public string enemyName => enemyType.enemyName;
	}
	public class SCPItem
	{
		public Item item = null;

		public ObjectClass ObjectClass;

		public bool TabletopItem = false;

		public bool GeneralItem = false;

		public bool SmallItem = false;

		public int scpDungeonRarity = 100;

		public int currentLevelRarity;

		public int price;
	}
	public enum ObjectClass
	{
		Unknown,
		Safe,
		Euclid,
		Keter
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "ProjectSCP.HeavyItemSCPs";

		public const string PLUGIN_NAME = "HeavyItemSCPs";

		public const string PLUGIN_VERSION = "1.3.2";
	}
}
namespace HeavyItemSCPs.Patches
{
	[HarmonyPatch(typeof(RoundManager))]
	internal class RoundManagerPatch
	{
		private static ManualLogSource logger = Plugin.LoggerInstance;

		private static bool isSCPDungeon = false;

		[HarmonyPrefix]
		[HarmonyPatch("SpawnScrapInLevel")]
		public static void SpawnScrapInLevelPrefix(RoundManager __instance)
		{
			string name = ((Object)__instance.dungeonGenerator.Generator.DungeonFlow).name;
			if (!(name == "SCPFlow"))
			{
				return;
			}
			logger.LogDebug((object)"SCPFlow detected");
			foreach (SCPItem scpItem in SCPItems.SCPItemsList)
			{
				if (scpItem.scpDungeonRarity != -1)
				{
					SpawnableItemWithRarity val = __instance.currentLevel.spawnableScrap.Where((SpawnableItemWithRarity x) => ((Object)x.spawnableItem).name == ((Object)scpItem.item).name).FirstOrDefault();
					if (val != null)
					{
						scpItem.currentLevelRarity = val.rarity;
						val.rarity = scpItem.scpDungeonRarity;
						logger.LogDebug((object)$"Rarity for {((Object)scpItem.item).name} set to {val.rarity} from {scpItem.currentLevelRarity}");
					}
				}
			}
			isSCPDungeon = true;
		}

		[HarmonyPostfix]
		[HarmonyPatch("SpawnScrapInLevel")]
		public static void SpawnScrapInLevelPostfix(RoundManager __instance)
		{
			if (!isSCPDungeon)
			{
				return;
			}
			logger.LogDebug((object)"Resetting rarities");
			isSCPDungeon = false;
			foreach (SCPItem scpItem in SCPItems.SCPItemsList)
			{
				if (scpItem.scpDungeonRarity != -1)
				{
					SpawnableItemWithRarity val = __instance.currentLevel.spawnableScrap.Where((SpawnableItemWithRarity x) => ((Object)x.spawnableItem).name == ((Object)scpItem.item).name).FirstOrDefault();
					if (val != null)
					{
						val.rarity = scpItem.currentLevelRarity;
						logger.LogDebug((object)$"Rarity for {((Object)scpItem.item).name} reset to {val.rarity} from {scpItem.scpDungeonRarity}");
					}
				}
			}
		}
	}
	[HarmonyPatch(typeof(StartOfRound))]
	internal class StartOfRoundPatch
	{
		private static ManualLogSource logger = Plugin.LoggerInstance;

		[HarmonyPostfix]
		[HarmonyPatch("firstDayAnimation")]
		public static void firstDayAnimationPostfix()
		{
			logger.LogDebug((object)"First day started");
			if (!NetworkManager.Singleton.IsHost && !NetworkManager.Singleton.IsServer)
			{
				return;
			}
			ItemGroup item = (from x in Resources.FindObjectsOfTypeAll<ItemGroup>()
				where ((Object)x).name == "TabletopItems"
				select x).First();
			ItemGroup item2 = (from x in Resources.FindObjectsOfTypeAll<ItemGroup>()
				where ((Object)x).name == "GeneralItemClass"
				select x).First();
			ItemGroup item3 = (from x in Resources.FindObjectsOfTypeAll<ItemGroup>()
				where ((Object)x).name == "SmallItems"
				select x).First();
			logger.LogDebug((object)"Got itemgroups");
			foreach (SCPItem scpItem in SCPItems.SCPItemsList)
			{
				if (!scpItem.TabletopItem && !scpItem.GeneralItem && !scpItem.SmallItem)
				{
					continue;
				}
				Item val = Items.LethalLibItemList.Where((Item x) => ((Object)x).name == ((Object)scpItem.item).name).First();
				val.spawnPositionTypes.Clear();
				if ((Object)(object)val != (Object)null)
				{
					if (scpItem.TabletopItem)
					{
						val.spawnPositionTypes.Add(item);
					}
					if (scpItem.GeneralItem)
					{
						val.spawnPositionTypes.Add(item2);
					}
					if (scpItem.SmallItem)
					{
						val.spawnPositionTypes.Add(item3);
					}
				}
			}
		}
	}
	internal class TESTING : MonoBehaviour
	{
		private static ManualLogSource logger = Plugin.LoggerInstance;

		public static float drunkness = 0f;

		[HarmonyPostfix]
		[HarmonyPatch(typeof(HUDManager), "PingScan_performed")]
		public static void PingScan_performedPostFix()
		{
			logger.LogDebug((object)("Insanity: " + Plugin.localPlayer.insanityLevel));
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(HUDManager), "SubmitChat_performed")]
		public static void SubmitChat_performedPrefix(HUDManager __instance)
		{
			//IL_0225: Unknown result type (might be due to invalid IL or missing references)
			//IL_022a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0236: Unknown result type (might be due to invalid IL or missing references)
			string text = __instance.chatTextField.text;
			string[] array = text.Split(" ");
			logger.LogDebug((object)text);
			switch (array[0])
			{
			case "/spawn":
			{
				EnemyType enemyType = SCPItems.SCPEnemiesList.Where((SCPEnemy x) => ((Object)x.enemyType).name == "SCP323_1Enemy").FirstOrDefault().enemyType;
				RoundManager.Instance.SpawnEnemyGameObject(((Component)Plugin.localPlayer).transform.position, Quaternion.identity.y, 0, enemyType);
				break;
			}
			case "/door":
				((EnemyAI)SCP323_1AI.Instance).openDoorSpeedMultiplier = float.Parse(array[1]);
				break;
			case "/drunk":
				drunkness = float.Parse(array[1]);
				break;
			case "/destroy":
			{
				GameObject val3 = (from x in Object.FindObjectsOfType<GameObject>()
					where Vector3.Distance(x.transform.position, ((Component)Plugin.localPlayer).transform.position) < 5f
					select x).FirstOrDefault();
				if ((Object)(object)val3 != (Object)null)
				{
					NetworkObject component = val3.GetComponent<NetworkObject>();
					if ((Object)(object)component != (Object)null && component.IsSpawned)
					{
						component.Despawn(true);
					}
					else
					{
						Object.Destroy((Object)(object)val3);
					}
				}
				break;
			}
			case "/state":
				SCP323Behavior.isTesting = true;
				SCP323Behavior.testState = (SCP323Behavior.AttachState)int.Parse(array[1]);
				SCP323Behavior.Instance?.ChangeAttachStateServerRpc(SCP323Behavior.testState);
				break;
			case "/enemies":
			{
				foreach (SpawnableEnemyWithRarity enemy in GetEnemies())
				{
					logger.LogDebug((object)((Object)enemy.enemyType).name);
				}
				break;
			}
			case "/outside":
				break;
			case "/refresh":
				RoundManager.Instance.RefreshEnemiesList();
				HoarderBugAI.RefreshGrabbableObjectsInMapList();
				break;
			case "/levels":
			{
				SelectableLevel[] levels = StartOfRound.Instance.levels;
				foreach (SelectableLevel val2 in levels)
				{
					logger.LogDebug((object)((Object)val2).name);
				}
				break;
			}
			case "/dungeon":
				logger.LogDebug((object)((Object)RoundManager.Instance.dungeonGenerator.Generator.DungeonFlow).name);
				break;
			case "/dungeons":
			{
				IndoorMapType[] dungeonFlowTypes = RoundManager.Instance.dungeonFlowTypes;
				foreach (IndoorMapType val in dungeonFlowTypes)
				{
					logger.LogDebug((object)((Object)val.dungeonFlow).name);
				}
				break;
			}
			}
		}

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

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

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

		public enum MaterialVariants
		{
			Player,
			Hoarderbug,
			BaboonHawk,
			None
		}

		private static ManualLogSource logger = Plugin.LoggerInstance;

		public Transform turnCompass = null;

		public Transform RightHandTransform = null;

		public AudioClip[] stompSFXList = null;

		public AudioClip roarSFX = null;

		public AudioClip warningRoarSFX = null;

		public AudioClip hitWallSFX = null;

		public NetworkAnimator networkAnimator = null;

		public Material[] materials = null;

		private readonly float throwForce = 70f;

		public static float SpeedAccelerationEffect = 2.3f;

		public static float BaseAcceleration = 30f;

		public static float SpeedIncreaseRate = 4f;

		public static float heldObjectVerticalOffset = 6f;

		private GameObject targetObject = null;

		private GrabbableObject heldObject = null;

		private float averageVelocity;

		private Vector3 previousPosition;

		private float previousVelocity;

		private float velocityInterval;

		private float velocityAverageCount;

		private float wallCollisionSFXDebounce;

		private float agentSpeedWithNegative;

		private bool throwingPlayer;

		private bool grabbingPlayer;

		private bool pickingUpScrap;

		private float timeSinceDamagePlayer;

		private float timeSinceThrowingPlayer;

		private float timeSinceSeenPlayer;

		private float idlingTimer;

		private float timeSpawned;

		private Vector3 forwardDirection;

		private Vector3 upDirection;

		private Vector3 throwDirection;

		private EnemyAI targetEnemy = null;

		private Plugin.DropMethod dropMethod;

		private int maxHealth;

		public ThreatType type => (ThreatType)4;

		public void SwitchToBehaviourCustom(State state)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			switch (state)
			{
			case State.Roaming:
				DoAnimationClientRpc(walk: true, run: false);
				((EnemyAI)this).StartSearch(((Component)this).transform.position, (AISearchRoutine)null);
				break;
			case State.Chasing:
				DoAnimationClientRpc(walk: false, run: true);
				((EnemyAI)this).StopSearch(base.currentSearch, true);
				break;
			case State.Throwing:
				((EnemyAI)this).StopSearch(base.currentSearch, true);
				break;
			}
			((EnemyAI)this).SwitchToBehaviourClientRpc((int)state);
		}

		public override void Start()
		{
			((EnemyAI)this).Start();
			logger.LogDebug((object)"SCP-427-1 Spawned");
			dropMethod = Plugin.config4271DropMethod.Value;
			maxHealth = Plugin.config4271MaxHealth.Value;
			SetOutsideOrInside();
			RoundManager.Instance.RefreshEnemiesList();
			HoarderBugAI.RefreshGrabbableObjectsInMapList();
			timeSinceSeenPlayer = float.PositiveInfinity;
			SwitchToBehaviourCustom(State.Roaming);
			logger.LogDebug((object)"Finished spawning SCP-427-1");
		}

		public override void Update()
		{
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			((EnemyAI)this).Update();
			timeSpawned += Time.deltaTime;
			timeSinceThrowingPlayer += Time.deltaTime;
			timeSinceDamagePlayer += Time.deltaTime;
			if (base.isEnemyDead || StartOfRound.Instance.allPlayersDead)
			{
				return;
			}
			if (grabbingPlayer && (Object)(object)base.inSpecialAnimationWithPlayer != (Object)null)
			{
				((Component)base.inSpecialAnimationWithPlayer).transform.position = RightHandTransform.position;
			}
			if ((Object)(object)heldObject != (Object)null)
			{
				((Component)heldObject).transform.position = RightHandTransform.position + new Vector3(0f, heldObjectVerticalOffset, 0f);
			}
			if (!Plugin.IsServerOrHost)
			{
				return;
			}
			if (base.currentBehaviourStateIndex == 0)
			{
				timeSinceSeenPlayer += Time.deltaTime;
			}
			if (idlingTimer > 0f)
			{
				idlingTimer -= Time.deltaTime;
				if (idlingTimer <= 0f && base.currentBehaviourStateIndex == 0)
				{
					DoAnimationClientRpc(walk: true, run: false);
					idlingTimer = 0f;
				}
			}
			CalculateAgentSpeed();
		}

		public override void DoAIInterval()
		{
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			((EnemyAI)this).DoAIInterval();
			if (base.isEnemyDead || StartOfRound.Instance.allPlayersDead || base.stunNormalizedTimer > 0f || timeSpawned < 2.5f)
			{
				return;
			}
			switch (base.currentBehaviourStateIndex)
			{
			case 0:
				if (FoundClosestPlayerInRange(25f, 5f))
				{
					if ((Object)(object)heldObject != (Object)null)
					{
						SwitchToBehaviourCustom(State.Throwing);
						AttemptThrowScrapAtTargetPlayer();
						break;
					}
					((EnemyAI)this).StopSearch(base.currentSearch, true);
					if (timeSinceSeenPlayer > 30f)
					{
						Roar();
					}
					else
					{
						SwitchToBehaviourCustom(State.Chasing);
					}
					idlingTimer = 0f;
					timeSinceSeenPlayer = 0f;
				}
				else
				{
					MoveTowardsScrapInLineOfSight();
				}
				break;
			case 1:
				if (!TargetClosestPlayerInAnyCase() || (Vector3.Distance(((Component)this).transform.position, ((Component)base.targetPlayer).transform.position) > 30f && !((EnemyAI)this).CheckLineOfSightForPosition(((Component)base.targetPlayer).transform.position, 45f, 60, -1f, (Transform)null)))
				{
					logger.LogDebug((object)"Stop Targeting");
					base.targetPlayer = null;
					SwitchToBehaviourCustom(State.Roaming);
				}
				else
				{
					((EnemyAI)this).SetMovingTowardsTargetPlayer(base.targetPlayer);
				}
				break;
			case 2:
				base.agent.speed = 0f;
				break;
			default:
				logger.LogWarning((object)("Invalid state: " + base.currentBehaviourStateIndex));
				break;
			}
		}

		private bool FoundClosestPlayerInRange(float range, float senseRange)
		{
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			((EnemyAI)this).TargetClosestPlayer(1.5f, true, 70f);
			if ((Object)(object)base.targetPlayer == (Object)null)
			{
				((EnemyAI)this).TargetClosestPlayer(1.5f, false, 70f);
				range = senseRange;
			}
			return (Object)(object)base.targetPlayer != (Object)null && Vector3.Distance(((Component)this).transform.position, ((Component)base.targetPlayer).transform.position) < range;
		}

		private bool FoundClosestPlayerInRange(float range)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			((EnemyAI)this).TargetClosestPlayer(1.5f, false, 70f);
			return (Object)(object)base.targetPlayer != (Object)null && Vector3.Distance(((Component)this).transform.position, ((Component)base.targetPlayer).transform.position) < range;
		}

		private bool TargetClosestPlayerInAnyCase()
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			base.mostOptimalDistance = 2000f;
			base.targetPlayer = null;
			for (int i = 0; i < StartOfRound.Instance.connectedPlayersAmount + 1; i++)
			{
				base.tempDist = Vector3.Distance(((Component)this).transform.position, ((Component)StartOfRound.Instance.allPlayerScripts[i]).transform.position);
				if (base.tempDist < base.mostOptimalDistance)
				{
					base.mostOptimalDistance = base.tempDist;
					base.targetPlayer = StartOfRound.Instance.allPlayerScripts[i];
				}
			}
			return (Object)(object)base.targetPlayer != (Object)null;
		}

		private void CalculateAgentSpeed()
		{
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_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)
			//IL_0256: Unknown result type (might be due to invalid IL or missing references)
			//IL_025b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0213: Unknown result type (might be due to invalid IL or missing references)
			if (base.stunNormalizedTimer >= 0f || base.currentBehaviourStateIndex == 2 || base.inSpecialAnimation || (idlingTimer > 0f && base.currentBehaviourStateIndex == 0))
			{
				base.agent.speed = 0f;
				base.agent.acceleration = 200f;
				return;
			}
			base.creatureAnimator.SetFloat("speedMultiplier", Mathf.Clamp(averageVelocity / 12f * 1.5f, 0.5f, 3f));
			Vector3 val = ((Component)this).transform.position - previousPosition;
			float num = ((Vector3)(ref val)).magnitude / (Time.deltaTime / 1.4f);
			if (velocityInterval <= 0f)
			{
				previousVelocity = averageVelocity;
				velocityInterval = 0.05f;
				velocityAverageCount += 1f;
				if (velocityAverageCount > 5f)
				{
					averageVelocity += (num - averageVelocity) / 3f;
				}
				else
				{
					averageVelocity += num;
					if (velocityAverageCount == 2f)
					{
						averageVelocity /= velocityAverageCount;
					}
				}
			}
			else
			{
				velocityInterval -= Time.deltaTime;
			}
			if (((NetworkBehaviour)this).IsOwner && averageVelocity - num > Mathf.Clamp(num * 0.5f, 5f, 100f) && num < 5f && base.currentBehaviourStateIndex == 1)
			{
				if (wallCollisionSFXDebounce > 0.5f)
				{
					base.creatureSFX.PlayOneShot(hitWallSFX, 0.7f);
					((EnemyAI)this).SetEnemyStunned(true, 0.5f, (PlayerControllerB)null);
					NetworkHandlerHeavy.Instance.ShakePlayerCamerasServerRpc((ScreenShakeType)1, 15f, ((Component)this).transform.position);
				}
				agentSpeedWithNegative *= 0.2f;
				wallCollisionSFXDebounce = 0f;
			}
			wallCollisionSFXDebounce += Time.deltaTime;
			previousPosition = ((Component)this).transform.position;
			if (base.currentBehaviourStateIndex == 0)
			{
				base.agent.speed = 2f;
				base.agent.acceleration = 26f;
			}
			else if (base.currentBehaviourStateIndex == 1)
			{
				agentSpeedWithNegative += Time.deltaTime * SpeedIncreaseRate;
				base.agent.speed = Mathf.Clamp(agentSpeedWithNegative, 0f, 11f);
				base.agent.acceleration = Mathf.Clamp(BaseAcceleration - averageVelocity * SpeedAccelerationEffect, 4f, 30f);
				if (base.agent.acceleration > 15f)
				{
					base.agent.angularSpeed = 500f;
					NavMeshAgent agent = base.agent;
					agent.acceleration += 25f;
				}
				else
				{
					base.agent.angularSpeed = 230f;
				}
			}
		}

		public void PlayStompSFX()
		{
			int num = Random.Range(0, stompSFXList.Count() - 1);
			float num2 = ((base.currentBehaviourStateIndex != 1) ? 0.7f : 1f);
			base.creatureSFX.PlayOneShot(stompSFXList[num], num2);
		}

		public void SetOutsideOrInside()
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			GameObject closestAINode = GetClosestAINode(GameObject.FindGameObjectsWithTag("OutsideAINode").ToList());
			GameObject closestAINode2 = GetClosestAINode(GameObject.FindGameObjectsWithTag("AINode").ToList());
			if (Vector3.Distance(((Component)this).transform.position, closestAINode.transform.position) < Vector3.Distance(((Component)this).transform.position, closestAINode2.transform.position))
			{
				logger.LogDebug((object)"Setting enemy outside");
				SetEnemyOutsideClientRpc(value: true);
			}
			else
			{
				logger.LogDebug((object)"Setting enemy inside");
			}
		}

		public GameObject GetClosestAINode(List<GameObject> nodes)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			float num = float.PositiveInfinity;
			G