Decompiled source of SCP682 v1.0.6

scripts/plugins/ProjectSCP.SCP682.dll

Decompiled 4 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using LethalLib.Modules;
using Md.CaveDwellerAI;
using Md.JesterAI;
using Md.LungProp;
using Microsoft.CodeAnalysis;
using MonoDetour;
using MonoDetour.Cil;
using MonoDetour.DetourTypes;
using MonoDetour.HookGen;
using MonoDetour.Reflection.Unspeakable;
using MonoMod.Utils;
using ProjectSCP.SCP682.NetcodePatcher;
using SCP682.Configuration;
using SCP682.Hooks;
using SCP682.SCPEnemy;
using SCP682.SCPEnemy.DoorBreak;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Video;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: MonoDetourTargets(typeof(LungProp), Members = new string[] { "DisconnectFromMachinery" })]
[assembly: MonoDetourTargets(typeof(CaveDwellerAI), Members = new string[] { "Start" })]
[assembly: MonoDetourTargets(typeof(JesterAI), Members = new string[] { "Start" })]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("ProjectSCP.SCP682")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.6.0")]
[assembly: AssemblyInformationalVersion("1.0.6+3117961102d0635f7dddcae92ba3892c6dadf004")]
[assembly: AssemblyProduct("ProjectSCP.SCP682")]
[assembly: AssemblyTitle("SCP682")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/Hamunii/LC-SCP-682-Enemy")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
[module: NetcodePatchedAssembly]
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 Md.LungProp
{
	internal static class DisconnectFromMachinery
	{
		public delegate void PrefixSignature(LungProp self);

		public delegate void PostfixSignature(LungProp self, ref IEnumerator returnValue);

		public delegate void PrefixMoveNextSignature(SpeakableEnumerator<object, LungProp> self);

		public delegate void PostfixMoveNextSignature(SpeakableEnumerator<object, LungProp> self, ref bool continueEnumeration);

		public static MonoDetourHook Prefix(PrefixSignature hook, MonoDetourConfig? config = null, bool applyByDefault = true, MonoDetourManager? manager = null)
		{
			return (manager ?? DefaultMonoDetourManager.Instance).Hook<PrefixDetour>(Target(), (Delegate)hook, config, applyByDefault);
		}

		public static MonoDetourHook Postfix(PostfixSignature hook, MonoDetourConfig? config = null, bool applyByDefault = true, MonoDetourManager? manager = null)
		{
			return (manager ?? DefaultMonoDetourManager.Instance).Hook<PostfixDetour>(Target(), (Delegate)hook, config, applyByDefault);
		}

		public static MonoDetourHook ILHook(Manipulator manipulator, MonoDetourConfig? config = null, bool applyByDefault = true, MonoDetourManager? manager = null)
		{
			return (manager ?? DefaultMonoDetourManager.Instance).ILHook(Target(), manipulator, config, applyByDefault);
		}

		public static MonoDetourHook PrefixMoveNext(PrefixMoveNextSignature hook, MonoDetourConfig? config = null, bool applyByDefault = true, MonoDetourManager? manager = null)
		{
			return (manager ?? DefaultMonoDetourManager.Instance).Hook<PrefixDetour>((MethodBase)StateMachineTarget(), (Delegate)hook, config, applyByDefault);
		}

		public static MonoDetourHook PostfixMoveNext(PostfixMoveNextSignature hook, MonoDetourConfig? config = null, bool applyByDefault = true, MonoDetourManager? manager = null)
		{
			return (manager ?? DefaultMonoDetourManager.Instance).Hook<PostfixDetour>((MethodBase)StateMachineTarget(), (Delegate)hook, config, applyByDefault);
		}

		public static MonoDetourHook ILHookMoveNext(Manipulator manipulator, MonoDetourConfig? config = null, bool applyByDefault = true, MonoDetourManager? manager = null)
		{
			return (manager ?? DefaultMonoDetourManager.Instance).ILHook((MethodBase)StateMachineTarget(), manipulator, config, applyByDefault);
		}

		public static MethodBase Target()
		{
			Type typeFromHandle = typeof(LungProp);
			MethodInfo method = typeFromHandle.GetMethod("DisconnectFromMachinery", (BindingFlags)(-1), null, Array.Empty<Type>(), null);
			if ((object)method == null)
			{
				throw new MissingMethodException("LungProp", "DisconnectFromMachinery");
			}
			return method;
		}

		public static MethodInfo StateMachineTarget()
		{
			return Extensions.GetStateMachineTarget((MethodInfo)Target());
		}
	}
}
namespace Md.JesterAI
{
	internal static class Start
	{
		public delegate void PrefixSignature(JesterAI self);

		public delegate void PostfixSignature(JesterAI self);

		public static MonoDetourHook Prefix(PrefixSignature hook, MonoDetourConfig? config = null, bool applyByDefault = true, MonoDetourManager? manager = null)
		{
			return (manager ?? DefaultMonoDetourManager.Instance).Hook<PrefixDetour>(Target(), (Delegate)hook, config, applyByDefault);
		}

		public static MonoDetourHook Postfix(PostfixSignature hook, MonoDetourConfig? config = null, bool applyByDefault = true, MonoDetourManager? manager = null)
		{
			return (manager ?? DefaultMonoDetourManager.Instance).Hook<PostfixDetour>(Target(), (Delegate)hook, config, applyByDefault);
		}

		public static MonoDetourHook ILHook(Manipulator manipulator, MonoDetourConfig? config = null, bool applyByDefault = true, MonoDetourManager? manager = null)
		{
			return (manager ?? DefaultMonoDetourManager.Instance).ILHook(Target(), manipulator, config, applyByDefault);
		}

		public static MethodBase Target()
		{
			Type typeFromHandle = typeof(JesterAI);
			MethodInfo method = typeFromHandle.GetMethod("Start", (BindingFlags)(-1), null, Array.Empty<Type>(), null);
			if ((object)method == null)
			{
				throw new MissingMethodException("JesterAI", "Start");
			}
			return method;
		}
	}
}
namespace Md.CaveDwellerAI
{
	internal static class Start
	{
		public delegate void PrefixSignature(CaveDwellerAI self);

		public delegate void PostfixSignature(CaveDwellerAI self);

		public static MonoDetourHook Prefix(PrefixSignature hook, MonoDetourConfig? config = null, bool applyByDefault = true, MonoDetourManager? manager = null)
		{
			return (manager ?? DefaultMonoDetourManager.Instance).Hook<PrefixDetour>(Target(), (Delegate)hook, config, applyByDefault);
		}

		public static MonoDetourHook Postfix(PostfixSignature hook, MonoDetourConfig? config = null, bool applyByDefault = true, MonoDetourManager? manager = null)
		{
			return (manager ?? DefaultMonoDetourManager.Instance).Hook<PostfixDetour>(Target(), (Delegate)hook, config, applyByDefault);
		}

		public static MonoDetourHook ILHook(Manipulator manipulator, MonoDetourConfig? config = null, bool applyByDefault = true, MonoDetourManager? manager = null)
		{
			return (manager ?? DefaultMonoDetourManager.Instance).ILHook(Target(), manipulator, config, applyByDefault);
		}

		public static MethodBase Target()
		{
			Type typeFromHandle = typeof(CaveDwellerAI);
			MethodInfo method = typeFromHandle.GetMethod("Start", (BindingFlags)(-1), null, Array.Empty<Type>(), null);
			if ((object)method == null)
			{
				throw new MissingMethodException("CaveDwellerAI", "Start");
			}
			return method;
		}
	}
}
namespace MonoDetour.HookGen
{
	internal static class DefaultMonoDetourManager
	{
		internal static MonoDetourManager Instance { get; } = New();


		internal static MonoDetourManager New()
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Expected O, but got Unknown
			return new MonoDetourManager(typeof(DefaultMonoDetourManager).Assembly.GetName().Name);
		}
	}
	[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class, AllowMultiple = true, Inherited = false)]
	internal class MonoDetourTargetsAttribute : Attribute, IMonoDetourTargets
	{
		public Type? TargetType { get; }

		public bool IncludeNestedTypes { get; set; }

		public string[]? Members { get; set; }

		public string[]? MemberNamePrefixes { get; set; }

		public string[]? MemberNameSuffixes { get; set; }

		public bool GenerateControlFlowVariants { get; set; }

		public MonoDetourTargetsAttribute(Type? targetType = null)
		{
			TargetType = targetType;
			IncludeNestedTypes = true;
			base..ctor();
		}
	}
}
namespace BepInEx
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	[Conditional("CodeGeneration")]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class BepInAutoPluginAttribute : Attribute
	{
		public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace BepInEx.Preloader.Core.Patching
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	[Conditional("CodeGeneration")]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class PatcherAutoPluginAttribute : Attribute
	{
		public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace Microsoft.CodeAnalysis
{
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace SCP682
{
	internal static class AddEnemyScript
	{
		internal static void SCP682AI(EnemyType enemyType, AssetBundle assets)
		{
			GameObject enemyPrefab = enemyType.enemyPrefab;
			SCP682AI sCP682AI = enemyPrefab.AddComponent<SCP682AI>();
			((EnemyAI)sCP682AI).enemyType = enemyType;
			((EnemyAI)sCP682AI).creatureAnimator = enemyPrefab.GetComponentInChildren<Animator>();
			((EnemyAI)sCP682AI).creatureVoice = ((Component)enemyPrefab.transform.Find("ModelRoot/CrocodileModel/CG/Pelvis/CreatureVoice")).GetComponent<AudioSource>();
			((EnemyAI)sCP682AI).creatureSFX = ((Component)enemyPrefab.transform.Find("CreatureSFX")).GetComponent<AudioSource>();
			((EnemyAI)sCP682AI).eye = enemyPrefab.transform.Find("Eye");
			((EnemyAI)sCP682AI).dieSFX = assets.LoadAsset<AudioClip>("SkibidiDeath");
			((EnemyAI)sCP682AI).enemyBehaviourStates = (EnemyBehaviourState[])(object)new EnemyBehaviourState[20];
			((EnemyAI)sCP682AI).AIIntervalTime = 0.2f;
			((EnemyAI)sCP682AI).agent = enemyPrefab.GetComponent<NavMeshAgent>();
			((EnemyAI)sCP682AI).updatePositionThreshold = 0.1f;
			((EnemyAI)sCP682AI).syncMovementSpeed = 0.22f;
			((EnemyAI)sCP682AI).enemyHP = 18;
			EnemyAICollisionDetect componentInChildren = enemyPrefab.GetComponentInChildren<EnemyAICollisionDetect>();
			componentInChildren.mainScript = (EnemyAI)(object)sCP682AI;
			DoorDestroyerCollider doorDestroyerCollider = ((Component)componentInChildren).gameObject.AddComponent<DoorDestroyerCollider>();
			doorDestroyerCollider.AI = sCP682AI;
		}

		internal static void RemoveComponent<T>(this GameObject gameObject) where T : Component
		{
			T component = gameObject.GetComponent<T>();
			Object.Destroy((Object)(object)component);
		}
	}
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("ProjectSCP.SCP682", "SCP682", "1.0.6")]
	public class Plugin : BaseUnityPlugin
	{
		public static AssetBundle? modAssets;

		internal static EnemyType SCP682ET;

		public const string Id = "ProjectSCP.SCP682";

		internal static ManualLogSource Logger { get; private set; }

		internal static PluginConfig BoundConfig { get; private set; }

		public static string Name => "SCP682";

		public static string Version => "1.0.6";

		private void Awake()
		{
			Logger = ((BaseUnityPlugin)this).Logger;
			Stopwatch stopwatch = Stopwatch.StartNew();
			Logger.LogInfo((object)("Plugin ProjectSCP.SCP682 " + Version + " started loading..."));
			BoundConfig = new PluginConfig(((BaseUnityPlugin)this).Config);
			InitializeNetworkBehaviours();
			string path = Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), "SCP682Assets");
			modAssets = AssetBundle.LoadFromFile(Path.Combine(path, "scp682assets"));
			if (modAssets == null)
			{
				Logger.LogError((object)"Failed to load custom assets.");
				return;
			}
			SFX.InitializeSFX(modAssets);
			SCP682ET = modAssets.LoadAsset<EnemyType>("SCP682ET");
			TerminalNode val = modAssets.LoadAsset<TerminalNode>("SCP682TN");
			AssetBundle val2 = AssetBundle.LoadFromFile(Path.Combine(path, "scp682videobundle"));
			VideoClip displayVideo = val2.LoadAsset<VideoClip>("SCP682Spin");
			val.displayVideo = displayVideo;
			AddEnemyScript.SCP682AI(SCP682ET, modAssets);
			NetworkPrefabs.RegisterNetworkPrefab(SCP682ET.enemyPrefab);
			Enemies.RegisterEnemy(SCP682ET, 20, (LevelTypes)(-1), val, (TerminalKeyword)null);
			JesterListHook.Init();
			ApparatusTakenHook.Init();
			CaveDwellerList.Init();
			stopwatch.Stop();
			Logger.LogInfo((object)string.Format("{0} loaded in {1}ms!", "ProjectSCP.SCP682", stopwatch.ElapsedMilliseconds));
		}

		private static void InitializeNetworkBehaviours()
		{
			Type[] array;
			try
			{
				array = Assembly.GetExecutingAssembly().GetTypes();
			}
			catch (ReflectionTypeLoadException ex)
			{
				array = ex.Types.Where((Type t) => t != null).ToArray();
			}
			Type[] array2 = array;
			foreach (Type type in array2)
			{
				MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
				MethodInfo[] array3 = methods;
				foreach (MethodInfo methodInfo in array3)
				{
					object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
					if (customAttributes.Length != 0)
					{
						methodInfo.Invoke(null, null);
					}
				}
			}
		}
	}
	internal static class PLog
	{
		internal static void Log(object data)
		{
			Plugin.Logger.LogInfo(data);
		}

		internal static void LogWarning(object data)
		{
			Plugin.Logger.LogWarning(data);
		}

		internal static void LogError(object data)
		{
			Plugin.Logger.LogError(data);
		}
	}
}
namespace SCP682.Hooks
{
	internal static class ApparatusTakenHook
	{
		internal static void Init()
		{
			DisconnectFromMachinery.PostfixMoveNext(Postfix_LungProp_DisconnectFromMachinery_MoveNext);
		}

		private static void Postfix_LungProp_DisconnectFromMachinery_MoveNext(SpeakableEnumerator<object, LungProp> self, ref bool continueEnumeration)
		{
			if (!continueEnumeration)
			{
				if (Random.Range(0, 2) == 0)
				{
					SpawnSCP682(outside: true);
				}
				else
				{
					SpawnSCP682(outside: false);
				}
			}
		}

		internal static void SpawnSCP682(bool outside)
		{
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			if (NetworkManager.Singleton.IsHost && Plugin.SCP682ET.numberSpawned <= 0)
			{
				RoundManager instance = RoundManager.Instance;
				GameObject[] array;
				if (outside)
				{
					array = GameObject.FindGameObjectsWithTag("OutsideAINode");
					instance.currentOutsideEnemyPower += Plugin.SCP682ET.PowerLevel;
				}
				else
				{
					array = GameObject.FindGameObjectsWithTag("AINode");
					instance.currentEnemyPower += Plugin.SCP682ET.PowerLevel;
				}
				EnemyType sCP682ET = Plugin.SCP682ET;
				sCP682ET.numberSpawned++;
				Vector3 position = array[instance.AnomalyRandom.Next(0, array.Length)].transform.position;
				position = instance.GetRandomNavMeshPositionInBoxPredictable(position, 10f, default(NavMeshHit), instance.AnomalyRandom, instance.GetLayermaskForEnemySizeLimit(Plugin.SCP682ET, false, -1), 1f);
				position = instance.PositionWithDenialPointsChecked(position, array, Plugin.SCP682ET, -1f, (Random)null);
				NetworkObjectReference val = instance.SpawnEnemyGameObject(position, 0f, 1, Plugin.SCP682ET);
				NetworkObject val2 = default(NetworkObject);
				if (!((NetworkObjectReference)(ref val)).TryGet(ref val2, (NetworkManager)null))
				{
					Plugin.Logger.LogError((object)"Couldn't get network object for spawned enemy!");
					return;
				}
				SCP682AI component = ((Component)val2).GetComponent<SCP682AI>();
				((EnemyAI)component).enemyType.isOutsideEnemy = outside;
			}
		}
	}
	internal static class CaveDwellerList
	{
		[CompilerGenerated]
		private sealed class <GetBabyCaveDwellers>d__3 : IEnumerable<CaveDwellerAI>, IEnumerable, IEnumerator<CaveDwellerAI>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private CaveDwellerAI <>2__current;

			private int <>l__initialThreadId;

			private int <i>5__2;

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

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

			[DebuggerHidden]
			public <GetBabyCaveDwellers>d__3(int <>1__state)
			{
				this.<>1__state = <>1__state;
				<>l__initialThreadId = Environment.CurrentManagedThreadId;
			}

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

			private bool MoveNext()
			{
				int num = <>1__state;
				if (num != 0)
				{
					if (num != 1)
					{
						return false;
					}
					<>1__state = -1;
					goto IL_007b;
				}
				<>1__state = -1;
				<i>5__2 = 0;
				goto IL_008b;
				IL_007b:
				<i>5__2++;
				goto IL_008b;
				IL_008b:
				if (<i>5__2 < caveDwellerEnemies.Count)
				{
					CaveDwellerAI val = caveDwellerEnemies[<i>5__2];
					if ((Object)(object)val == (Object)null || ((EnemyAI)val).currentBehaviourStateIndex != 0)
					{
						caveDwellerEnemies.RemoveAt(<i>5__2);
						<i>5__2--;
						goto IL_007b;
					}
					<>2__current = val;
					<>1__state = 1;
					return true;
				}
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}

			[DebuggerHidden]
			IEnumerator<CaveDwellerAI> IEnumerable<CaveDwellerAI>.GetEnumerator()
			{
				if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
				{
					<>1__state = 0;
					return this;
				}
				return new <GetBabyCaveDwellers>d__3(0);
			}

			[DebuggerHidden]
			IEnumerator IEnumerable.GetEnumerator()
			{
				return ((IEnumerable<CaveDwellerAI>)this).GetEnumerator();
			}
		}

		public static List<CaveDwellerAI?> caveDwellerEnemies = new List<CaveDwellerAI>();

		internal static void Init()
		{
			Md.CaveDwellerAI.Start.Postfix(Postfix_CaveDwellerAI_Start);
		}

		private static void Postfix_CaveDwellerAI_Start(CaveDwellerAI self)
		{
			caveDwellerEnemies.Add(self);
		}

		[IteratorStateMachine(typeof(<GetBabyCaveDwellers>d__3))]
		public static IEnumerable<CaveDwellerAI> GetBabyCaveDwellers()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <GetBabyCaveDwellers>d__3(-2);
		}
	}
	internal static class JesterListHook
	{
		[CompilerGenerated]
		private sealed class <GetJesters>d__3 : IEnumerable<JesterAI>, IEnumerable, IEnumerator<JesterAI>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private JesterAI <>2__current;

			private int <>l__initialThreadId;

			private int <i>5__2;

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

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

			[DebuggerHidden]
			public <GetJesters>d__3(int <>1__state)
			{
				this.<>1__state = <>1__state;
				<>l__initialThreadId = Environment.CurrentManagedThreadId;
			}

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

			private bool MoveNext()
			{
				int num = <>1__state;
				if (num != 0)
				{
					if (num != 1)
					{
						return false;
					}
					<>1__state = -1;
					goto IL_0073;
				}
				<>1__state = -1;
				<i>5__2 = 0;
				goto IL_0083;
				IL_0073:
				<i>5__2++;
				goto IL_0083;
				IL_0083:
				if (<i>5__2 < jesterEnemies.Count)
				{
					JesterAI val = jesterEnemies[<i>5__2];
					if ((Object)(object)val == (Object)null)
					{
						jesterEnemies.RemoveAt(<i>5__2);
						<i>5__2--;
						goto IL_0073;
					}
					<>2__current = val;
					<>1__state = 1;
					return true;
				}
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}

			[DebuggerHidden]
			IEnumerator<JesterAI> IEnumerable<JesterAI>.GetEnumerator()
			{
				if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
				{
					<>1__state = 0;
					return this;
				}
				return new <GetJesters>d__3(0);
			}

			[DebuggerHidden]
			IEnumerator IEnumerable.GetEnumerator()
			{
				return ((IEnumerable<JesterAI>)this).GetEnumerator();
			}
		}

		public static List<JesterAI?> jesterEnemies = new List<JesterAI>();

		internal static void Init()
		{
			Md.JesterAI.Start.Postfix(Postfix_JesterAI_Start);
		}

		private static void Postfix_JesterAI_Start(JesterAI self)
		{
			jesterEnemies.Add(self);
		}

		[IteratorStateMachine(typeof(<GetJesters>d__3))]
		public static IEnumerable<JesterAI> GetJesters()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <GetJesters>d__3(-2);
		}
	}
}
namespace SCP682.SCPEnemy
{
	public abstract class ModEnemyAI<T> : ModEnemyAINetworkLayer where T : ModEnemyAI<T>
	{
		public abstract class AIBehaviorState : AIBase
		{
			public abstract List<AIStateTransition> Transitions { get; set; }

			public abstract IEnumerator OnStateEntered();

			public virtual void Update()
			{
			}

			public virtual void LateUpdate()
			{
			}

			public virtual void AIInterval()
			{
			}

			public virtual void OnCollideWithPlayer(Collider other)
			{
			}

			public virtual void OnCollideWithEnemy(Collider other, EnemyAI? collidedEnemy)
			{
			}

			public abstract IEnumerator OnStateExit();
		}

		public abstract class AIStateTransition : AIBase
		{
			public abstract bool CanTransitionBeTaken();

			public virtual void AIInterval()
			{
			}

			public abstract AIBehaviorState NextState();

			public virtual void OnCollideWithPlayer(Collider other)
			{
			}
		}

		public abstract class AIBase
		{
			public T self;

			public NavMeshAgent Agent => ((EnemyAI)self).agent;

			public PlayerControllerB? TargetPlayer
			{
				get
				{
					return self.targetPlayer;
				}
				set
				{
					self.targetPlayer = value;
				}
			}

			public Random EnemyRandom => self.enemyRandom;

			public Animator CreatureAnimator => ((EnemyAI)self).creatureAnimator;

			public AudioSource CreatureSFX => ((EnemyAI)self).creatureSFX;

			public AudioSource CreatureVoice => ((EnemyAI)self).creatureVoice;
		}

		private class TransitionType
		{
			internal readonly Type type;

			internal readonly bool isTransition;

			public TransitionType(Type type, bool isTransition)
			{
				this.type = type;
				this.isTransition = isTransition;
				base..ctor();
			}
		}

		public enum PlayerState
		{
			Dead,
			Outside,
			Inside,
			Ship
		}

		[CompilerGenerated]
		private sealed class <AllPlayers>d__41 : IEnumerable<PlayerControllerB>, IEnumerable, IEnumerator<PlayerControllerB>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private PlayerControllerB <>2__current;

			private int <>l__initialThreadId;

			private PlayerControllerB[] <>7__wrap1;

			private int <>7__wrap2;

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

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

			[DebuggerHidden]
			public <AllPlayers>d__41(int <>1__state)
			{
				this.<>1__state = <>1__state;
				<>l__initialThreadId = Environment.CurrentManagedThreadId;
			}

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

			private bool MoveNext()
			{
				int num = <>1__state;
				if (num != 0)
				{
					if (num != 1)
					{
						return false;
					}
					<>1__state = -1;
					goto IL_0065;
				}
				<>1__state = -1;
				<>7__wrap1 = StartOfRound.Instance.allPlayerScripts;
				<>7__wrap2 = 0;
				goto IL_0073;
				IL_0065:
				<>7__wrap2++;
				goto IL_0073;
				IL_0073:
				if (<>7__wrap2 < <>7__wrap1.Length)
				{
					PlayerControllerB val = <>7__wrap1[<>7__wrap2];
					if (!val.isPlayerDead && val.isPlayerControlled)
					{
						<>2__current = val;
						<>1__state = 1;
						return true;
					}
					goto IL_0065;
				}
				<>7__wrap1 = null;
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}

			[DebuggerHidden]
			IEnumerator<PlayerControllerB> IEnumerable<PlayerControllerB>.GetEnumerator()
			{
				if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
				{
					<>1__state = 0;
					return this;
				}
				return new <AllPlayers>d__41(0);
			}

			[DebuggerHidden]
			IEnumerator IEnumerable.GetEnumerator()
			{
				return ((IEnumerable<PlayerControllerB>)this).GetEnumerator();
			}
		}

		[CompilerGenerated]
		private sealed class <GetAllTransitions>d__28 : IEnumerable<AIStateTransition>, IEnumerable, IEnumerator<AIStateTransition>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private AIStateTransition <>2__current;

			private int <>l__initialThreadId;

			public ModEnemyAI<T> <>4__this;

			private List<AIStateTransition>.Enumerator <>7__wrap1;

			ModEnemyAI<T>.AIStateTransition IEnumerator<AIStateTransition>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

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

			[DebuggerHidden]
			public <GetAllTransitions>d__28(int <>1__state)
			{
				this.<>1__state = <>1__state;
				<>l__initialThreadId = Environment.CurrentManagedThreadId;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				switch (<>1__state)
				{
				case -3:
				case 1:
					try
					{
					}
					finally
					{
						<>m__Finally1();
					}
					break;
				case -4:
				case 2:
					try
					{
					}
					finally
					{
						<>m__Finally2();
					}
					break;
				}
				<>7__wrap1 = default(List<AIStateTransition>.Enumerator);
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				try
				{
					int num = <>1__state;
					ModEnemyAI<T> modEnemyAI = <>4__this;
					switch (num)
					{
					default:
						return false;
					case 0:
						<>1__state = -1;
						<>7__wrap1 = modEnemyAI.globalTransitions.GetEnumerator();
						<>1__state = -3;
						goto IL_007f;
					case 1:
						<>1__state = -3;
						goto IL_007f;
					case 2:
						{
							<>1__state = -4;
							break;
						}
						IL_007f:
						if (<>7__wrap1.MoveNext())
						{
							AIStateTransition current = <>7__wrap1.Current;
							modEnemyAI.InitializeStateTransition(current, modEnemyAI.self);
							<>2__current = current;
							<>1__state = 1;
							return true;
						}
						<>m__Finally1();
						<>7__wrap1 = default(List<AIStateTransition>.Enumerator);
						<>7__wrap1 = modEnemyAI.activeState.Transitions.GetEnumerator();
						<>1__state = -4;
						break;
					}
					if (<>7__wrap1.MoveNext())
					{
						AIStateTransition current2 = <>7__wrap1.Current;
						modEnemyAI.InitializeStateTransition(current2, modEnemyAI.self);
						<>2__current = current2;
						<>1__state = 2;
						return true;
					}
					<>m__Finally2();
					<>7__wrap1 = default(List<AIStateTransition>.Enumerator);
					return false;
				}
				catch
				{
					//try-fault
					((IDisposable)this).Dispose();
					throw;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			private void <>m__Finally1()
			{
				<>1__state = -1;
				((IDisposable)<>7__wrap1).Dispose();
			}

			private void <>m__Finally2()
			{
				<>1__state = -1;
				((IDisposable)<>7__wrap1).Dispose();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}

			[DebuggerHidden]
			IEnumerator<AIStateTransition> IEnumerable<AIStateTransition>.GetEnumerator()
			{
				<GetAllTransitions>d__28 result;
				if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
				{
					<>1__state = 0;
					result = this;
				}
				else
				{
					result = new <GetAllTransitions>d__28(0)
					{
						<>4__this = <>4__this
					};
				}
				return result;
			}

			[DebuggerHidden]
			IEnumerator IEnumerable.GetEnumerator()
			{
				return ((IEnumerable<AIStateTransition>)this).GetEnumerator();
			}
		}

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

			private object <>2__current;

			public AIBehaviorState activeState;

			public T self;

			public ModEnemyAI<T> <>4__this;

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

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

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

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

			private bool MoveNext()
			{
				int num = <>1__state;
				ModEnemyAI<T> modEnemyAI = <>4__this;
				switch (num)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					activeState.self = self;
					<>2__current = ((MonoBehaviour)modEnemyAI).StartCoroutine(activeState.OnStateEntered());
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					modEnemyAI._transitionCoroutineInProgress = null;
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

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

			private object <>2__current;

			public string stateOrTransitionName;

			public ModEnemyAI<T> <>4__this;

			public int randomSeed;

			private AIStateTransition <localNextTransition>5__2;

			private TransitionType <transitionOrBehavior>5__3;

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

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

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

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<localNextTransition>5__2 = null;
				<transitionOrBehavior>5__3 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				int num = <>1__state;
				ModEnemyAI<T> modEnemyAI = <>4__this;
				switch (num)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<localNextTransition>5__2 = null;
					if (!ModEnemyAI<T>._typeNameAndInstanceTypeToTransitionType.TryGetValue((stateOrTransitionName, ((object)modEnemyAI.self).GetType()), out <transitionOrBehavior>5__3))
					{
						modEnemyAI.ValidateAndCacheTransitionType(stateOrTransitionName, ref <transitionOrBehavior>5__3);
					}
					if (<transitionOrBehavior>5__3.isTransition)
					{
						<localNextTransition>5__2 = (AIStateTransition)Activator.CreateInstance(<transitionOrBehavior>5__3.type);
						modEnemyAI.InitializeStateTransition(<localNextTransition>5__2, modEnemyAI.self);
						if (<localNextTransition>5__2.NextState().GetType() == modEnemyAI.activeState.GetType())
						{
							return false;
						}
					}
					modEnemyAI.DebugLog($"{((NetworkBehaviour)modEnemyAI).__getTypeName()} #{((EnemyAI)modEnemyAI.self).thisEnemyIndex} is Exiting:  {modEnemyAI.activeState}");
					<>2__current = ((MonoBehaviour)modEnemyAI).StartCoroutine(modEnemyAI.activeState.OnStateExit());
					<>1__state = 1;
					return true;
				case 1:
				{
					<>1__state = -1;
					Type type = modEnemyAI.activeState.GetType();
					if (<localNextTransition>5__2 != null)
					{
						modEnemyAI.DebugLog($"{((NetworkBehaviour)modEnemyAI).__getTypeName()} #{((EnemyAI)modEnemyAI.self).thisEnemyIndex} is Transitioning via:  {<localNextTransition>5__2}");
						modEnemyAI.activeState = <localNextTransition>5__2.NextState();
					}
					else
					{
						modEnemyAI.DebugLog($"{((NetworkBehaviour)modEnemyAI).__getTypeName()} #{((EnemyAI)modEnemyAI.self).thisEnemyIndex} is Transitioning via: State Override");
						modEnemyAI.activeState = (AIBehaviorState)Activator.CreateInstance(<transitionOrBehavior>5__3.type);
					}
					modEnemyAI.previousStateType = type;
					modEnemyAI.DebugLog($"{((NetworkBehaviour)modEnemyAI).__getTypeName()} #{((EnemyAI)modEnemyAI.self).thisEnemyIndex} is Entering:  {modEnemyAI.activeState}");
					((MonoBehaviour)modEnemyAI).StartCoroutine(modEnemyAI.InitializeAndEnterState(modEnemyAI.activeState, modEnemyAI.self, new Random(randomSeed)));
					StartOfRound.Instance.ClientPlayerList.TryGetValue(NetworkManager.Singleton.LocalClientId, out var value);
					modEnemyAI.DebugLog($"CREATURE: {((Object)((EnemyAI)modEnemyAI).enemyType).name} #{((EnemyAI)modEnemyAI.self).thisEnemyIndex} STATE: {modEnemyAI.activeState} ON PLAYER: #{value} ({StartOfRound.Instance.allPlayerScripts[value].playerUsername})");
					return false;
				}
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		private static readonly Dictionary<(string, Type), TransitionType> _typeNameAndInstanceTypeToTransitionType = new Dictionary<(string, Type), TransitionType>();

		internal AIBehaviorState activeState;

		internal Type? previousStateType;

		internal Random enemyRandom;

		internal float AITimer;

		internal bool printDebugs;

		internal PlayerState myValidState = PlayerState.Inside;

		internal AIStateTransition nextTransition;

		internal List<AIStateTransition> globalTransitions = new List<AIStateTransition>();

		internal T self;

		private PlayerControllerB? _lastSyncedTargetPlayer;

		public PlayerControllerB? targetPlayer
		{
			get
			{
				if (((NetworkBehaviour)this).IsOwner && (Object)(object)((EnemyAI)this).targetPlayer != (Object)(object)_lastSyncedTargetPlayer)
				{
					if (((EnemyAI)this).targetPlayer != null)
					{
						SetTargetServerRpc((int)((EnemyAI)this).targetPlayer.actualClientId);
					}
					else
					{
						SetTargetServerRpc(-1);
					}
				}
				return ((EnemyAI)this).targetPlayer;
			}
			set
			{
				if (!((Object)(object)value == (Object)(object)_lastSyncedTargetPlayer) || !((Object)(object)_lastSyncedTargetPlayer == (Object)(object)((EnemyAI)this).targetPlayer))
				{
					if (value != null)
					{
						SetTargetServerRpc((int)value.actualClientId);
					}
					else
					{
						SetTargetServerRpc(-1);
					}
				}
			}
		}

		internal abstract T GetThis();

		internal abstract AIBehaviorState GetInitialState();

		public override string __getTypeName()
		{
			return ((object)this).GetType().Name;
		}

		public override void Start()
		{
			self = GetThis();
			activeState = GetInitialState();
			enemyRandom = new Random(StartOfRound.Instance.randomMapSeed + ((EnemyAI)this).thisEnemyIndex);
			myValidState = (((EnemyAI)this).enemyType.isOutsideEnemy ? PlayerState.Outside : PlayerState.Inside);
			((EnemyAI)this).creatureAnimator.Rebind();
			((EnemyAI)this).Start();
			if (!((EnemyAI)this).agent.isOnNavMesh && ((NetworkBehaviour)this).IsOwner)
			{
				DebugLog("CREATURE " + ((NetworkBehaviour)this).__getTypeName() + " WAS NOT PLACED ON NAVMESH, DESTROYING...");
				((EnemyAI)this).KillEnemyOnOwnerClient(false);
			}
			_transitionCoroutineInProgress = ((MonoBehaviour)this).StartCoroutine(InitializeAndEnterState(activeState, self, enemyRandom));
		}

		public override void Update()
		{
			if (((EnemyAI)this).isEnemyDead)
			{
				return;
			}
			((EnemyAI)this).Update();
			AITimer += Time.deltaTime;
			if (((NetworkBehaviour)this).IsOwner)
			{
				if (_transitionCoroutineInProgress != null)
				{
					return;
				}
				foreach (AIStateTransition allTransition in GetAllTransitions())
				{
					if (allTransition.CanTransitionBeTaken() && ((NetworkBehaviour)this).IsOwner)
					{
						nextTransition = allTransition;
						TransitionStateServerRpc(nextTransition.ToString(), enemyRandom.Next());
						return;
					}
				}
			}
			activeState.Update();
		}

		internal void LateUpdate()
		{
			if (_transitionCoroutineInProgress == null)
			{
				activeState.LateUpdate();
			}
		}

		public override void DoAIInterval()
		{
			((EnemyAI)this).DoAIInterval();
			if (_transitionCoroutineInProgress != null)
			{
				return;
			}
			foreach (AIStateTransition allTransition in GetAllTransitions())
			{
				allTransition.AIInterval();
			}
			activeState.AIInterval();
		}

		public override void OnCollideWithPlayer(Collider other)
		{
			((EnemyAI)this).OnCollideWithPlayer(other);
			activeState.OnCollideWithPlayer(other);
			foreach (AIStateTransition allTransition in GetAllTransitions())
			{
				allTransition.OnCollideWithPlayer(other);
			}
		}

		public override void OnCollideWithEnemy(Collider other, EnemyAI? collidedEnemy = null)
		{
			((EnemyAI)this).OnCollideWithEnemy(other, collidedEnemy);
			activeState.OnCollideWithEnemy(other, collidedEnemy);
		}

		[IteratorStateMachine(typeof(ModEnemyAI<>.<GetAllTransitions>d__28))]
		private IEnumerable<AIStateTransition> GetAllTransitions()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <GetAllTransitions>d__28(-2)
			{
				<>4__this = this
			};
		}

		[IteratorStateMachine(typeof(ModEnemyAI<>.<InitializeAndEnterState>d__29))]
		private IEnumerator InitializeAndEnterState(AIBehaviorState activeState, T self, Random enemyRandom)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <InitializeAndEnterState>d__29(0)
			{
				<>4__this = this,
				activeState = activeState,
				self = self
			};
		}

		private void InitializeStateTransition(AIStateTransition transition, T self)
		{
			transition.self = self;
		}

		internal void DebugLog(object data)
		{
			if (printDebugs)
			{
				PLog.Log(data);
			}
		}

		internal void OverrideState(AIBehaviorState state)
		{
			if (!((EnemyAI)this).isEnemyDead)
			{
				TransitionStateServerRpc(state.ToString(), enemyRandom.Next());
			}
		}

		[IteratorStateMachine(typeof(ModEnemyAI<>.<TransitionState>d__33))]
		internal override IEnumerator TransitionState(string stateOrTransitionName, int randomSeed)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <TransitionState>d__33(0)
			{
				<>4__this = this,
				stateOrTransitionName = stateOrTransitionName,
				randomSeed = randomSeed
			};
		}

		private void ValidateAndCacheTransitionType(string stateOrTransitionName, [NotNull] ref TransitionType? transitionOrBehavior)
		{
			Type type = Type.GetType(stateOrTransitionName) ?? throw new ArgumentException("'" + stateOrTransitionName + "' wasn't found as a type!", "stateOrTransitionName");
			if (type.IsSubclassOf(typeof(AIStateTransition)))
			{
				transitionOrBehavior = new TransitionType(type, isTransition: true);
				_typeNameAndInstanceTypeToTransitionType.Add((stateOrTransitionName, ((object)self).GetType()), transitionOrBehavior);
				return;
			}
			if (type.IsSubclassOf(typeof(AIBehaviorState)))
			{
				transitionOrBehavior = new TransitionType(type, isTransition: false);
				_typeNameAndInstanceTypeToTransitionType.Add((stateOrTransitionName, ((object)self).GetType()), transitionOrBehavior);
				return;
			}
			throw new ArgumentException("'" + stateOrTransitionName + "' is neither an AIStateTransition nor an AIBehaviorState!", "stateOrTransitionName");
		}

		protected override void SetTarget(int PlayerID)
		{
			if (PlayerID == -1)
			{
				((EnemyAI)this).targetPlayer = null;
				_lastSyncedTargetPlayer = null;
				DebugLog($"Clearing target on {this}");
			}
			else if ((Object)(object)StartOfRound.Instance.allPlayerScripts[PlayerID] == (Object)null)
			{
				DebugLog($"Index invalid! {this}");
			}
			else
			{
				((EnemyAI)this).targetPlayer = StartOfRound.Instance.allPlayerScripts[PlayerID];
				_lastSyncedTargetPlayer = ((EnemyAI)this).targetPlayer;
				DebugLog($"{this} setting target to: {((EnemyAI)this).targetPlayer.playerUsername}");
			}
		}

		internal AIBehaviorState? CreatePreviousState()
		{
			if ((object)previousStateType == null)
			{
				return null;
			}
			return (AIBehaviorState)Activator.CreateInstance(previousStateType);
		}

		internal bool AnimationIsFinished(string AnimName, int layerIndex)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			AnimatorStateInfo currentAnimatorStateInfo = ((EnemyAI)this).creatureAnimator.GetCurrentAnimatorStateInfo(layerIndex);
			if (!((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName(AnimName))
			{
				DebugLog(((NetworkBehaviour)this).__getTypeName() + ": Checking for animation " + AnimName + ", but current animation is " + ((Object)((AnimatorClipInfo)(ref ((EnemyAI)this).creatureAnimator.GetCurrentAnimatorClipInfo(layerIndex)[0])).clip).name);
				return true;
			}
			currentAnimatorStateInfo = ((EnemyAI)this).creatureAnimator.GetCurrentAnimatorStateInfo(layerIndex);
			return ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).normalizedTime >= 1f;
		}

		internal bool PlayerCanBeTargeted(PlayerControllerB myPlayer)
		{
			return GetPlayerState(myPlayer) == myValidState;
		}

		internal PlayerState GetPlayerState(PlayerControllerB myPlayer)
		{
			if (myPlayer.isPlayerDead)
			{
				return PlayerState.Dead;
			}
			if (myPlayer.isInsideFactory)
			{
				return PlayerState.Inside;
			}
			if (myPlayer.isInHangarShipRoom)
			{
				return PlayerState.Ship;
			}
			return PlayerState.Outside;
		}

		internal void MoveTimerValue(ref float Timer, bool ShouldRaise = false)
		{
			if (ShouldRaise)
			{
				Timer += Time.deltaTime;
			}
			else if (!(Timer <= 0f))
			{
				Timer -= Time.deltaTime;
			}
		}

		[IteratorStateMachine(typeof(ModEnemyAI<>.<AllPlayers>d__41))]
		public IEnumerable<PlayerControllerB> AllPlayers()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <AllPlayers>d__41(-2);
		}

		public PlayerControllerB? IsAnyPlayerWithinLOS(int range = 45, float width = 60f, int proximityAwareness = -1, bool DoLinecast = true, bool PrintResults = false, bool SortByDistance = false)
		{
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			float num = range;
			PlayerControllerB result = null;
			PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
			foreach (PlayerControllerB val in allPlayerScripts)
			{
				if (!val.isPlayerDead && val.isPlayerControlled && IsTargetPlayerWithinLOS(val, range, width, proximityAwareness, DoLinecast, PrintResults))
				{
					if (!SortByDistance)
					{
						return val;
					}
					float num2 = Vector3.Distance(((Component)val).transform.position, ((Component)this).transform.position);
					if (num2 < num)
					{
						num = num2;
						result = val;
					}
				}
			}
			return result;
		}

		public bool IsTargetPlayerWithinLOS(PlayerControllerB player, int range = 45, float width = 60f, int proximityAwareness = -1, bool DoLinecast = true, bool PrintResults = false)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: 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_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: 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)
			float num = Vector3.Distance(((Component)this).transform.position, ((Component)player.gameplayCamera).transform.position);
			bool flag = num < (float)range;
			float num2 = Vector3.Angle(((Component)((EnemyAI)this).eye).transform.forward, ((Component)player.gameplayCamera).transform.position - ((Component)((EnemyAI)this).eye).transform.position);
			bool flag2 = num2 < width;
			bool flag3 = num < (float)proximityAwareness;
			bool flag4 = DoLinecast && Physics.Linecast(((Component)((EnemyAI)this).eye).transform.position, ((Component)player).transform.position, StartOfRound.Instance.collidersRoomDefaultAndFoliage, (QueryTriggerInteraction)1);
			if (PrintResults)
			{
				DebugLog($"Target in Distance: {flag} ({num})" + $"Target within view cone: {flag2} ({num2})" + $"LOSBlocked: {flag4}");
			}
			if (!(flag && flag2))
			{
				if (flag3)
				{
					return !flag4;
				}
				return false;
			}
			return true;
		}

		public bool IsTargetPlayerWithinLOS(int range = 45, float width = 60f, int proximityAwareness = -1, bool DoLinecast = true, bool PrintResults = false)
		{
			if ((Object)(object)targetPlayer == (Object)null)
			{
				DebugLog(((NetworkBehaviour)this).__getTypeName() + " called Target Player LOS check called with null target player; returning false!");
				return false;
			}
			return IsTargetPlayerWithinLOS(targetPlayer, range, width, proximityAwareness, DoLinecast, PrintResults);
		}

		public PlayerControllerB FindNearestPlayer(bool ValidateNav = false)
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			PlayerControllerB val = null;
			float num = 20000f;
			for (int i = 0; i < StartOfRound.Instance.allPlayerScripts.Length; i++)
			{
				PlayerControllerB val2 = StartOfRound.Instance.allPlayerScripts[i];
				if (!ValidateNav || ((EnemyAI)this).agent.CalculatePath(((Component)val2).transform.position, ((EnemyAI)this).path1))
				{
					float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)val2).transform.position);
					if (num2 < num)
					{
						val = val2;
						num = num2;
					}
				}
			}
			if ((Object)(object)val == (Object)null)
			{
				DebugLog("There is somehow no closest player. get fucked");
				return null;
			}
			return val;
		}

		internal bool IsPlayerReachable()
		{
			if ((Object)(object)targetPlayer == (Object)null)
			{
				PLog.LogError("Player Reach Test has no target player or passed in argument!");
				return false;
			}
			return IsPlayerReachable(targetPlayer);
		}

		internal bool IsPlayerReachable(PlayerControllerB? playerToCheck)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Invalid comparison between Unknown and I4
			if (playerToCheck == null)
			{
				return false;
			}
			Vector3 navMeshPosition = RoundManager.Instance.GetNavMeshPosition(((Component)playerToCheck).transform.position, RoundManager.Instance.navHit, 2.7f, -1);
			if (!RoundManager.Instance.GotNavMeshPositionResult)
			{
				DebugLog("Player Reach Test: No NavMesh position");
				return false;
			}
			((EnemyAI)this).agent.CalculatePath(navMeshPosition, ((EnemyAI)this).agent.path);
			bool flag = (int)((EnemyAI)this).agent.path.status == 0;
			DebugLog($"Player Reach Test: {flag}");
			return flag;
		}

		internal float PlayerDistanceFromShip(PlayerControllerB playerToCheck)
		{
			//IL_0019: 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)
			if (playerToCheck == null)
			{
				PLog.LogError("PlayerNearShip check has no target player or passed in argument!");
				return -1f;
			}
			float num = Vector3.Distance(((Component)playerToCheck).transform.position, ((Component)StartOfRound.Instance.shipBounds).transform.position);
			DebugLog($"PlayerNearShip check: {num}");
			return num;
		}

		internal bool PlayerWithinRange(PlayerControllerB player, float range, bool includeYAxis = true)
		{
			return DistanceFromPlayer(player, includeYAxis) <= range;
		}

		private float DistanceFromTargetPlayer(bool IncludeYAxis)
		{
			if ((Object)(object)targetPlayer == (Object)null)
			{
				PLog.LogError($"{this} attempted DistanceFromTargetPlayer with null target; returning -1!");
				return -1f;
			}
			return DistanceFromPlayer(targetPlayer, IncludeYAxis);
		}

		private float DistanceFromPlayer(PlayerControllerB player, bool IncludeYAxis)
		{
			//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)
			//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)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			if (IncludeYAxis)
			{
				return Vector3.Distance(((Component)player).transform.position, ((Component)this).transform.position);
			}
			Vector2 val = default(Vector2);
			((Vector2)(ref val))..ctor(((Component)player).transform.position.x, ((Component)player).transform.position.z);
			Vector2 val2 = default(Vector2);
			((Vector2)(ref val2))..ctor(((Component)this).transform.position.x, ((Component)this).transform.position.z);
			return Vector2.Distance(val, val2);
		}

		public void SetEnemyOutside(bool toOutside)
		{
			if (toOutside)
			{
				myValidState = PlayerState.Outside;
				((EnemyAI)this).SetEnemyOutside(true);
			}
			else
			{
				myValidState = PlayerState.Inside;
				((EnemyAI)this).SetEnemyOutside(false);
			}
		}

		protected override void TeleportSelfToOtherEntrance(bool isOutside)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			EntranceTeleport val = RoundManager.FindMainEntranceScript(!isOutside);
			Vector3 navMeshPosition = RoundManager.Instance.GetNavMeshPosition(val.entrancePoint.position, default(NavMeshHit), 5f, -1);
			if (((NetworkBehaviour)this).IsOwner)
			{
				((Behaviour)((EnemyAI)this).agent).enabled = false;
				((Component)this).transform.position = navMeshPosition;
				((Behaviour)((EnemyAI)this).agent).enabled = true;
			}
			else
			{
				((Component)this).transform.position = navMeshPosition;
			}
			((EnemyAI)this).serverPosition = navMeshPosition;
			SetEnemyOutside(!isOutside);
			PlayEntranceOpeningSound(val);
		}

		private void PlayEntranceOpeningSound(EntranceTeleport entrance)
		{
			if (entrance.doorAudios != null && entrance.doorAudios.Length != 0)
			{
				entrance.entrancePointAudio.PlayOneShot(entrance.doorAudios[0]);
				WalkieTalkie.TransmitOneShotAudio(entrance.entrancePointAudio, entrance.doorAudios[0], 1f);
			}
		}

		internal void EnterSpecialAnimationWithPlayer(PlayerControllerB player, bool stopMovementCalculations = true)
		{
			if (player.inSpecialInteractAnimation && (Object)(object)player.currentTriggerInAnimationWith != (Object)null)
			{
				player.currentTriggerInAnimationWith.CancelAnimationExternally();
			}
			player.inSpecialInteractAnimation = true;
			player.inAnimationWithEnemy = (EnemyAI)(object)self;
			((EnemyAI)self).inSpecialAnimationWithPlayer = player;
			if (stopMovementCalculations)
			{
				((EnemyAI)self).inSpecialAnimation = true;
			}
		}

		internal bool TryGetValidPlayerFromCollision(Collider other, [NotNullWhen(true)] out PlayerControllerB? player, bool allowNonLocalPlayer = false)
		{
			player = null;
			if (((EnemyAI)this).isEnemyDead)
			{
				return false;
			}
			if (!((EnemyAI)this).ventAnimationFinished)
			{
				return false;
			}
			if (((EnemyAI)this).stunNormalizedTimer >= 0f)
			{
				return false;
			}
			player = ((Component)other).gameObject.GetComponent<PlayerControllerB>();
			if ((Object)(object)player == (Object)null || (!allowNonLocalPlayer && (Object)(object)player != (Object)(object)GameNetworkManager.Instance.localPlayerController))
			{
				return false;
			}
			if (!((EnemyAI)this).PlayerIsTargetable(player, false, false, true))
			{
				return false;
			}
			return true;
		}

		internal bool IsPlayerInsideCollider(PlayerControllerB? player, Collider collider, float colliderScale = 1f)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)player == (Object)null)
			{
				return false;
			}
			int num = 8;
			Bounds bounds = collider.bounds;
			Vector3 center = ((Bounds)(ref bounds)).center;
			bounds = collider.bounds;
			Collider[] array = Physics.OverlapBox(center, ((Bounds)(ref bounds)).extents / 2f * colliderScale, Quaternion.identity, num);
			Collider[] array2 = array;
			foreach (Collider val in array2)
			{
				if (((Component)val).CompareTag("Player") && TryGetValidPlayerFromCollision(val, out PlayerControllerB player2, allowNonLocalPlayer: true) && (Object)(object)player2 == (Object)(object)player)
				{
					return true;
				}
			}
			return false;
		}

		protected override void __initializeVariables()
		{
			base.__initializeVariables();
		}

		protected override void __initializeRpcs()
		{
			base.__initializeRpcs();
		}

		protected internal override string __getTypeName()
		{
			return "ModEnemyAI`1";
		}
	}
	public abstract class ModEnemyAINetworkLayer : EnemyAI
	{
		internal Coroutine? _transitionCoroutineInProgress;

		[ServerRpc]
		internal void TransitionStateServerRpc(string stateName, int randomSeed)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Invalid comparison between Unknown and I4
			//IL_0152: 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_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Invalid comparison between Unknown and I4
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				if (((NetworkBehaviour)this).OwnerClientId != networkManager.LocalClientId)
				{
					if ((int)networkManager.LogLevel <= 1)
					{
						Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!");
					}
					return;
				}
				ServerRpcParams val = default(ServerRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1357830014u, val, (RpcDelivery)0);
				bool flag = stateName != null;
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives));
				if (flag)
				{
					((FastBufferWriter)(ref val2)).WriteValueSafe(stateName, false);
				}
				BytePacker.WriteValueBitPacked(val2, randomSeed);
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1357830014u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
			{
				((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0;
				TransitionStateClientRpc(stateName, randomSeed);
			}
		}

		[ClientRpc]
		internal void TransitionStateClientRpc(string stateName, int randomSeed)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: 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_010c: 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_00c7: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsServer || networkManager.IsHost))
			{
				ClientRpcParams val = default(ClientRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(755577249u, val, (RpcDelivery)0);
				bool flag = stateName != null;
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives));
				if (flag)
				{
					((FastBufferWriter)(ref val2)).WriteValueSafe(stateName, false);
				}
				BytePacker.WriteValueBitPacked(val2, randomSeed);
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 755577249u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0;
				_transitionCoroutineInProgress = ((MonoBehaviour)this).StartCoroutine(TransitionState(stateName, randomSeed));
			}
		}

		internal abstract IEnumerator TransitionState(string stateOrTransitionName, int randomSeed);

		[ServerRpc]
		protected void SetTargetServerRpc(int PlayerID)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Invalid comparison between Unknown and I4
			//IL_0114: 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_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Invalid comparison between Unknown and I4
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				if (((NetworkBehaviour)this).OwnerClientId != networkManager.LocalClientId)
				{
					if ((int)networkManager.LogLevel <= 1)
					{
						Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!");
					}
					return;
				}
				ServerRpcParams val = default(ServerRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(314908443u, val, (RpcDelivery)0);
				BytePacker.WriteValueBitPacked(val2, PlayerID);
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 314908443u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
			{
				((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0;
				SetTargetClientRpc(PlayerID);
			}
		}

		[ClientRpc]
		private void SetTargetClientRpc(int PlayerID)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2468484041u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, PlayerID);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2468484041u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0;
					SetTarget(PlayerID);
				}
			}
		}

		protected abstract void SetTarget(int PlayerID);

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

		[ServerRpc(RequireOwnership = false)]
		internal void SetAnimBoolOnServerRpc(string name, bool state)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: 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_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				ServerRpcParams val = default(ServerRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(4090843431u, val, (RpcDelivery)0);
				bool flag = name != null;
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives));
				if (flag)
				{
					((FastBufferWriter)(ref val2)).WriteValueSafe(name, false);
				}
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref state, default(ForPrimitives));
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 4090843431u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
			{
				((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0;
				if (((NetworkBehaviour)this).IsServer)
				{
					base.creatureAnimator.SetBool(name, state);
				}
			}
		}

		[ClientRpc]
		public void TeleportSelfToOtherEntranceClientRpc(bool isOutside)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(463666875u, val, (RpcDelivery)0);
					((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref isOutside, default(ForPrimitives));
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 463666875u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0;
					TeleportSelfToOtherEntrance(isOutside);
				}
			}
		}

		protected abstract void TeleportSelfToOtherEntrance(bool isOutside);

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

		protected override void __initializeRpcs()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Expected O, but got Unknown
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Expected O, but got Unknown
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Expected O, but got Unknown
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Expected O, but got Unknown
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Expected O, but got Unknown
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Expected O, but got Unknown
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Expected O, but got Unknown
			((NetworkBehaviour)this).__registerRpc(1357830014u, new RpcReceiveHandler(__rpc_handler_1357830014), "TransitionStateServerRpc");
			((NetworkBehaviour)this).__registerRpc(755577249u, new RpcReceiveHandler(__rpc_handler_755577249), "TransitionStateClientRpc");
			((NetworkBehaviour)this).__registerRpc(314908443u, new RpcReceiveHandler(__rpc_handler_314908443), "SetTargetServerRpc");
			((NetworkBehaviour)this).__registerRpc(2468484041u, new RpcReceiveHandler(__rpc_handler_2468484041), "SetTargetClientRpc");
			((NetworkBehaviour)this).__registerRpc(217962959u, new RpcReceiveHandler(__rpc_handler_217962959), "SetAnimTriggerOnServerRpc");
			((NetworkBehaviour)this).__registerRpc(4090843431u, new RpcReceiveHandler(__rpc_handler_4090843431), "SetAnimBoolOnServerRpc");
			((NetworkBehaviour)this).__registerRpc(463666875u, new RpcReceiveHandler(__rpc_handler_463666875), "TeleportSelfToOtherEntranceClientRpc");
			((EnemyAI)this).__initializeRpcs();
		}

		private static void __rpc_handler_1357830014(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Invalid comparison between Unknown and I4
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if (rpcParams.Server.Receive.SenderClientId != target.OwnerClientId)
			{
				if ((int)networkManager.LogLevel <= 1)
				{
					Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!");
				}
				return;
			}
			bool flag = default(bool);
			((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives));
			string stateName = null;
			if (flag)
			{
				((FastBufferReader)(ref reader)).ReadValueSafe(ref stateName, false);
			}
			int randomSeed = default(int);
			ByteUnpacker.ReadValueBitPacked(reader, ref randomSeed);
			target.__rpc_exec_stage = (__RpcExecStage)1;
			((ModEnemyAINetworkLayer)(object)target).TransitionStateServerRpc(stateName, randomSeed);
			target.__rpc_exec_stage = (__RpcExecStage)0;
		}

		private static void __rpc_handler_755577249(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: 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 stateName = null;
				if (flag)
				{
					((FastBufferReader)(ref reader)).ReadValueSafe(ref stateName, false);
				}
				int randomSeed = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref randomSeed);
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((ModEnemyAINetworkLayer)(object)target).TransitionStateClientRpc(stateName, randomSeed);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_314908443(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: 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_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Invalid comparison between Unknown and I4
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if (rpcParams.Server.Receive.SenderClientId != target.OwnerClientId)
			{
				if ((int)networkManager.LogLevel <= 1)
				{
					Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!");
				}
			}
			else
			{
				int targetServerRpc = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref targetServerRpc);
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((ModEnemyAINetworkLayer)(object)target).SetTargetServerRpc(targetServerRpc);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

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

		private static void __rpc_handler_217962959(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				bool flag = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives));
				string animTriggerOnServerRpc = null;
				if (flag)
				{
					((FastBufferReader)(ref reader)).ReadValueSafe(ref animTriggerOnServerRpc, false);
				}
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((ModEnemyAINetworkLayer)(object)target).SetAnimTriggerOnServerRpc(animTriggerOnServerRpc);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_4090843431(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: 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 name = null;
				if (flag)
				{
					((FastBufferReader)(ref reader)).ReadValueSafe(ref name, false);
				}
				bool state = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref state, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((ModEnemyAINetworkLayer)(object)target).SetAnimBoolOnServerRpc(name, state);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_463666875(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				bool isOutside = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref isOutside, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((ModEnemyAINetworkLayer)(object)target).TeleportSelfToOtherEntranceClientRpc(isOutside);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "ModEnemyAINetworkLayer";
		}
	}
	internal class SCP682AI : ModEnemyAI<SCP682AI>, IVisibleThreat
	{
		public enum Speed
		{
			Stopped = 0,
			Walking = 3,
			Running = 10
		}

		public enum EnemyScale
		{
			Small,
			Big
		}

		private static class Anim
		{
			internal const string isMoving = "isMoving";

			internal const string isMovingInverted = "isMovingInverted";

			internal const string isRunning = "isRunning";

			internal const string isOnShip = "isOnShip";

			internal const string doKillEnemy = "KillEnemy";

			internal const string doRevive = "doRevive";

			internal const string doBite = "doBite";

			internal const string doRoar = "doRoar";
		}

		private class WanderToShipState : AIBehaviorState
		{
			[CompilerGenerated]
			private sealed class <OnStateEntered>d__4 : IEnumerator<object>, IEnumerator, IDisposable
			{
				private int <>1__state;

				private object <>2__current;

				public WanderToShipState <>4__this;

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

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

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

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

				private bool MoveNext()
				{
					int num = <>1__state;
					WanderToShipState wanderToShipState = <>4__this;
					if (num != 0)
					{
						return false;
					}
					<>1__state = -1;
					wanderToShipState.self.AnimatorSetBool("isMoving", value: true);
					return false;
				}

				bool IEnumerator.MoveNext()
				{
					//ILSpy generated this explicit interface implementation from .override directive in MoveNext
					return this.MoveNext();
				}

				[DebuggerHidden]
				void IEnumerator.Reset()
				{
					throw new NotSupportedException();
				}
			}

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

				private object <>2__current;

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

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

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

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

				private bool MoveNext()
				{
					if (<>1__state != 0)
					{
						return false;
					}
					<>1__state = -1;
					return false;
				}

				bool IEnumerator.MoveNext()
				{
					//ILSpy generated this explicit interface implementation from .override directive in MoveNext
					return this.MoveNext();
				}

				[DebuggerHidden]
				void IEnumerator.Reset()
				{
					throw new NotSupportedException();
				}
			}

			public override List<AIStateTransition> Transitions { get; set; } = new List<ModEnemyAI<SCP682AI>.AIStateTransition>(3)
			{
				new OnShipAmbushState.ArrivedAtShipTransition(),
				new InvestigatePlayerTransition(),
				new AttackEnemyState.TargetEnemyTransition()
			};


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

			public override void AIInterval()
			{
				//IL_000c: Unknown result type (might be due to invalid IL or missing references)
				((EnemyAI)self).SetDestinationToPosition(self.PosOnTopOfShip, false);
			}

			[IteratorStateMachine(typeof(<OnStateExit>d__6))]
			public override IEnumerator OnStateExit()
			{
				//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
				return new <OnStateExit>d__6(0);
			}
		}

		private class OnShipAmbushState : AIBehaviorState
		{
			internal class ArrivedAtShipTransition : AIStateTransition
			{
				public override bool CanTransitionBeTaken()
				{
					//IL_0006: Unknown result type (might be due to invalid IL or missing references)
					//IL_001b: Unknown result type (might be due to invalid IL or missing references)
					if (Vector3.Distance(self.PosOnTopOfShip, ((Component)self).gameObject.transform.position) < 3f)
					{
						return true;
					}
					return false;
				}

				public override AIBehaviorState NextState()
				{
					return new OnShipAmbushState();
				}
			}

			private class AmbushPlayerFromShipTransition : AIStateTransition
			{
				public override bool CanTransitionBeTaken()
				{
					if ((Object)(object)self.PlayerHeardFromNoise != (Object)null)
					{
						base.TargetPlayer = self.PlayerHeardFromNoise;
						if (!self.PlayerWithinRange(base.TargetPlayer, 30f))
						{
							return false;
						}
						return true;
					}
					base.TargetPlayer = self.FindNearestPlayer();
					return false;
				}

				public override AIBehaviorState NextState()
				{
					return new FromAmbushJumpPlayerState();
				}
			}

			private class BoredOfAmbushTransition : AIStateTransition
			{
				private float boredOfAmbushTimer = 35f;

				public override bool CanTransitionBeTaken()
				{
					boredOfAmbushTimer -= Time.deltaTime;
					if (boredOfAmbushTimer <= 0f)
					{
						return true;
					}
					return false;
				}

				public override AIBehaviorState NextState()
				{
					return new WanderThroughEntranceState();
				}
			}

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

				private object <>2__current;

				public OnShipAmbushState <>4__this;

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

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

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

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

				private bool MoveNext()
				{
					//IL_004d: Unknown result type (might be due to invalid IL or missing references)
					//IL_0069: Unknown result type (might be due to invalid IL or missing references)
					//IL_006e: Unknown result type (might be due to invalid IL or missing references)
					//IL_0095: Unknown result type (might be due to invalid IL or missing references)
					int num = <>1__state;
					OnShipAmbushState onShipAmbushState = <>4__this;
					if (num != 0)
					{
						return false;
					}
					<>1__state = -1;
					onShipAmbushState.self.AnimatorSetBool("isMoving", value: false);
					onShipAmbushState.self.AnimatorSetBool("isOnShip", value: true);
					onShipAmbushState.Agent.SetDestination(((Component)onShipAmbushState.Agent).transform.position);
					((EnemyAI)onShipAmbushState.self).destination = ((Component)onShipAmbushState.Agent).transform.position;
					((Behaviour)onShipAmbushState.Agent).enabled = false;
					((Component)onShipAmbushState.self).gameObject.transform.position = onShipAmbushState.self.PosOnTopOfShip;
					if (onShipAmbushState.self.changeScaleCoroutine != null)
					{
						((MonoBehaviour)onShipAmbushState.self).StopCoroutine(onShipAmbushState.self.changeScaleCoroutine);
					}
					((MonoBehaviour)onShipAmbushState.self).StartCoroutine(onShipAmbushState.self.ChangeEnemyScaleTo(EnemyScale.Small));
					return false;
				}

				bool IEnumerator.MoveNext()
				{
					//ILSpy generated this explicit interface implementation from .override directive in MoveNext
					return this.MoveNext();
				}

				[DebuggerHidden]
				void IEnumerator.Reset()
				{
					throw new NotSupportedException();
				}
			}

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

				private object <>2__current;

				public OnShipAmbushState <>4__this;

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

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

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

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

				private bool MoveNext()
				{
					int num = <>1__state;
					OnShipAmbushState onShipAmbushState = <>4__this;
					if (num != 0)
					{
						return false;
					}
					<>1__state = -1;
					onShipAmbushState.self.AnimatorSetBool("isMoving", value: true);
					onShipAmbushState.self.AnimatorSetBool("isOnShip", value: false);
					((Behaviour)onShipAmbushState.Agent).enabled = true;
					if (onShipAmbushState.self.changeScaleCoroutine != null)
					{
						((MonoBehaviour)onShipAmbushState.self).StopCoroutine(onShipAmbushState.self.changeScaleCoroutine);
					}
					((MonoBehaviour)onShipAmbushState.self).StartCoroutine(onShipAmbushState.self.ChangeEnemyScaleTo(EnemyScale.Big));
					return false;
				}

				bool IEnumerator.MoveNext()
				{
					//ILSpy generated this explicit interface implementation from .override directive in MoveNext
					return this.MoveNext();
				}

				[DebuggerHidden]
				void IEnumerator.Reset()
				{
					throw new NotSupportedException();
				}
			}

			public override List<AIStateTransition> Transitions { get; set; } = new List<ModEnemyAI<SCP682AI>.AIStateTransition>(2)
			{
				new AmbushPlayerFromShipTransition(),
				new BoredOfAmbushTransition()
			};


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

			public override void Update()
			{
				//IL_0040: Unknown result type (might be due to invalid IL or missing references)
				//IL_0055: Unknown result type (might be due to invalid IL or missing references)
				//IL_0064: Unknown result type (might be due to invalid IL or missing references)
				//IL_0069: Unknown result type (might be due to invalid IL or missing references)
				//IL_0079: Unknown result type (might be due to invalid IL or missing references)
				if (!((Object)(object)base.TargetPlayer == (Object)null))
				{
					self.turnCompass.LookAt(((Component)base.TargetPlayer).transform);
					((Component)self).transform.rotation = Quaternion.Lerp(((Component)self).transform.rotation, Quaternion.Euler(new Vector3(0f, self.turnCompass.eulerAngles.y, 0f)), 1f * Time.deltaTime);
				}
			}

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

		private class FromAmbushJumpPlayerState : AIBehaviorState
		{
			private class TouchTargetPlayerAndStartDraggingTransition : AIStateTransition
			{
				public override bool CanTransitionBeTaken()
				{
					return self.IsPlayerInsideCollider(base.TargetPlayer, (Collider)(object)self.mainCollider);
				}

				public override AIBehaviorState NextState()
				{
					return new DragPlayerState();
				}
			}

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

				private object <>2__current;

				public FromAmbushJumpPlayerState <>4__this;

				private Vector3 <positionBehindPlayer>5__2;

				private Vector3 <positionInBetweenInAir>5__3;

				private Vector3 <originalPosition>5__4;

				private float <normalizedTimer>5__5;

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

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

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

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

				private bool MoveNext()
				{
					//IL_0098: Unknown result type (might be due to invalid IL or missing references)
					//IL_00ac: 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_00c1: Unknown result type (might be due to invalid IL or missing references)
					//IL_00c6: 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_00cc: Unknown result type (might be due to invalid IL or missing references)
					//IL_0107: Unknown result type (might be due to invalid IL or missing references)
					//IL_010c: Unknown result type (might be due to invalid IL or missing references)
					//IL_0113: Unknown result type (might be due to invalid IL or missing references)
					//IL_0119: 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_0128: Unknown result type (might be due to invalid IL or missing references)
					//IL_012d: Unknown result type (might be due to invalid IL or missing references)
					//IL_0137: 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_0141: Unknown result type (might be due to invalid IL or missing references)
					//IL_0152: Unknown result type (might be due to invalid IL or missing references)
					//IL_0157: Unknown result type (might be due to invalid IL or missing references)
					//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
					//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
					//IL_01c7: 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_01cf: Unknown result type (might be due to invalid IL or missing references)
					//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
					//IL_01e0: 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_01f2: Unknown result type (might be due to invalid IL or missing references)
					//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
					//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
					//IL_0239: 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)
					int num = <>1__state;
					FromAmbushJumpPlayerState fromAmbushJumpPlayerState = <>4__this;
					switch (num)
					{
					default:
						return false;
					case 0:
					{
						<>1__state = -1;
						if ((Object)(object)fromAmbushJumpPlayerState.TargetPlayer == (Object)null)
						{
							Plugin.Logger.LogError((object)"Trying to ambush player, but targetPlayer is null! Not jumping.");
							((MonoBehaviour)fromAmbushJumpPlayerState.self).StartCoroutine(fromAmbushJumpPlayerState.self.RoarAndRunCoroutine());
							return false;
						}
						if (fromAmbushJumpPlayerState.TargetPlayer.isInHangarShipRoom)
						{
							fromAmbushJumpPlayerState.self.DebugLog("TargetPlayer is inside ship, attacking without a jump.");
							((MonoBehaviour)fromAmbushJumpPlayerState.self).StartCoroutine(fromAmbushJumpPlayerState.self.RoarAndRunCoroutine());
							return false;
						}
						Vector3 val = ((Component)fromAmbushJumpPlayerState.TargetPlayer).transform.position - Vector3.Scale(new Vector3(10f, 0f, 10f), ((Component)fromAmbushJumpPlayerState.TargetPlayer).transform.forward);
						NavMeshHit val2 = default(NavMeshHit);
						if (!NavMesh.SamplePosition(val, ref val2, 10f, -1))
						{
							Plugin.Logger.LogWarning((object)"Trying to ambush player, but didn't find NavMesh near target player! Not jumping.");
							((MonoBehaviour)fromAmbushJumpPlayerState.self).StartCoroutine(fromAmbushJumpPlayerState.self.RoarAndRunCoroutine());
							return false;
						}
						<positionBehindPlayer>5__2 = ((NavMeshHit)(ref val2)).position;
						<positionInBetweenInAir>5__3 = (<positionBehindPlayer>5__2 + <positionBehindPlayer>5__2) / 2f + Vector3.up * 10f;
						<originalPosition>5__4 = ((Component)fromAmbushJumpPlayerState.self).transform.position;
						fromAmbushJumpPlayerState.Agent.speed = 0f;
						fromAmbushJumpPlayerState.self.AnimatorSetBool("isRunning", value: true);
						((Behaviour)fromAmbushJumpPlayerState.Agent).enabled = false;
						<normalizedTimer>5__5 = 0f;
						break;
					}
					ca

scripts/plugins/SCP682Assets/ProjectSCP.SCP682.UnityRef.dll

Decompiled 4 days ago
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using Microsoft.CodeAnalysis;
using SCP682.UnityRef.Extensions;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("ProjectSCP.SCP682.UnityRef")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.6.0")]
[assembly: AssemblyInformationalVersion("1.0.6+3117961102d0635f7dddcae92ba3892c6dadf004")]
[assembly: AssemblyProduct("ProjectSCP.SCP682.UnityRef")]
[assembly: AssemblyTitle("SCP682.UnityRef")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/Hamunii/LC-SCP-682-Enemy")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
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;
		}
	}
}
[BepInPlugin("ProjectSCP.SCP682.UnityRef", "SCP682.UnityRef", "1.0.6")]
public class Plugin : BaseUnityPlugin
{
	public const string Id = "ProjectSCP.SCP682.UnityRef";

	public static string Name => "SCP682.UnityRef";

	public static string Version => "1.0.6";
}
namespace BepInEx
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	[Conditional("CodeGeneration")]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class BepInAutoPluginAttribute : Attribute
	{
		public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace BepInEx.Preloader.Core.Patching
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	[Conditional("CodeGeneration")]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class PatcherAutoPluginAttribute : Attribute
	{
		public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace Microsoft.CodeAnalysis
{
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace SCP682.UnityRef
{
	public class SCP682AnimatorAudio : MonoBehaviour
	{
		[field: SerializeField]
		public AudioSource CreatureSFX { get; private set; }

		[field: SerializeField]
		public AudioSource CreatureVoice { get; private set; }

		[field: SerializeField]
		public List<AudioClip> WalkSFX { get; private set; } = new List<AudioClip>();


		[field: SerializeField]
		public List<AudioClip> RunSFX { get; private set; } = new List<AudioClip>();


		[field: SerializeField]
		public List<AudioClip> RoarSFX { get; private set; } = new List<AudioClip>();


		[field: SerializeField]
		public List<AudioClip> BiteSFX { get; private set; } = new List<AudioClip>();


		public void PlayWalkSFX()
		{
			CreatureSFX.PlayOneShot(WalkSFX.Random());
		}

		public void PlayRunSFX()
		{
			CreatureSFX.PlayOneShot(RunSFX.Random());
		}

		public void PlayRoarSFX()
		{
			CreatureVoice.PlayOneShot(RoarSFX.Random());
		}

		public void PlayBiteSFX()
		{
			CreatureVoice.PlayOneShot(BiteSFX.Random());
		}
	}
}
namespace SCP682.UnityRef.Extensions
{
	internal static class AudioClipExtensions
	{
		private static readonly Random random = new Random();

		public static AudioClip Random(this List<AudioClip> clips)
		{
			return clips[random.Next(clips.Count)];
		}
	}
}
namespace System.Diagnostics.CodeAnalysis
{
	[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class ConstantExpectedAttribute : Attribute
	{
		public object? Min { get; set; }

		public object? Max { get; set; }
	}
	[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class ExperimentalAttribute : Attribute
	{
		public string DiagnosticId { get; }

		public string? UrlFormat { get; set; }

		public ExperimentalAttribute(string diagnosticId)
		{
			DiagnosticId = diagnosticId;
		}
	}
	[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
	[ExcludeFromCodeCoverage]
	internal sealed class MemberNotNullAttribute : Attribute
	{
		public string[] Members { get; }

		public MemberNotNullAttribute(string member)
		{
			Members = new string[1] { member };
		}

		public MemberNotNullAttribute(params string[] members)
		{
			Members = members;
		}
	}
	[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
	[ExcludeFromCodeCoverage]
	internal sealed class MemberNotNullWhenAttribute : Attribute
	{
		public bool ReturnValue { get; }

		public string[] Members { get; }

		public MemberNotNullWhenAttribute(bool returnValue, string member)
		{
			ReturnValue = returnValue;
			Members = new string[1] { member };
		}

		public MemberNotNullWhenAttribute(bool returnValue, params string[] members)
		{
			ReturnValue = returnValue;
			Members = members;
		}
	}
	[AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class SetsRequiredMembersAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class StringSyntaxAttribute : Attribute
	{
		public const string CompositeFormat = "CompositeFormat";

		public const string DateOnlyFormat = "DateOnlyFormat";

		public const string DateTimeFormat = "DateTimeFormat";

		public const string EnumFormat = "EnumFormat";

		public const string GuidFormat = "GuidFormat";

		public const string Json = "Json";

		public const string NumericFormat = "NumericFormat";

		public const string Regex = "Regex";

		public const string TimeOnlyFormat = "TimeOnlyFormat";

		public const string TimeSpanFormat = "TimeSpanFormat";

		public const string Uri = "Uri";

		public const string Xml = "Xml";

		public string Syntax { get; }

		public object?[] Arguments { get; }

		public StringSyntaxAttribute(string syntax)
		{
			Syntax = syntax;
			Arguments = new object[0];
		}

		public StringSyntaxAttribute(string syntax, params object?[] arguments)
		{
			Syntax = syntax;
			Arguments = arguments;
		}
	}
	[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class UnscopedRefAttribute : Attribute
	{
	}
}
namespace System.Runtime.Versioning
{
	[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class RequiresPreviewFeaturesAttribute : Attribute
	{
		public string? Message { get; }

		public string? Url { get; set; }

		public RequiresPreviewFeaturesAttribute()
		{
		}

		public RequiresPreviewFeaturesAttribute(string? message)
		{
			Message = message;
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
	[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class CallerArgumentExpressionAttribute : Attribute
	{
		public string ParameterName { get; }

		public CallerArgumentExpressionAttribute(string parameterName)
		{
			ParameterName = parameterName;
		}
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class CollectionBuilderAttribute : Attribute
	{
		public Type BuilderType { get; }

		public string MethodName { get; }

		public CollectionBuilderAttribute(Type builderType, string methodName)
		{
			BuilderType = builderType;
			MethodName = methodName;
		}
	}
	[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class CompilerFeatureRequiredAttribute : Attribute
	{
		public const string RefStructs = "RefStructs";

		public const string RequiredMembers = "RequiredMembers";

		public string FeatureName { get; }

		public bool IsOptional { get; set; }

		public CompilerFeatureRequiredAttribute(string featureName)
		{
			FeatureName = featureName;
		}
	}
	[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class InterpolatedStringHandlerArgumentAttribute : Attribute
	{
		public string[] Arguments { get; }

		public InterpolatedStringHandlerArgumentAttribute(string argument)
		{
			Arguments = new string[1] { argument };
		}

		public InterpolatedStringHandlerArgumentAttribute(params string[] arguments)
		{
			Arguments = arguments;
		}
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class InterpolatedStringHandlerAttribute : Attribute
	{
	}
	[EditorBrowsable(EditorBrowsableState.Never)]
	[ExcludeFromCodeCoverage]
	internal static class IsExternalInit
	{
	}
	[AttributeUsage(AttributeTargets.Method, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class ModuleInitializerAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class OverloadResolutionPriorityAttribute : Attribute
	{
		public int Priority { get; }

		public OverloadResolutionPriorityAttribute(int priority)
		{
			Priority = priority;
		}
	}
	[AttributeUsage(AttributeTargets.Parameter, Inherited = true, AllowMultiple = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class ParamCollectionAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class RequiredMemberAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
	[EditorBrowsable(EditorBrowsableState.Never)]
	[ExcludeFromCodeCoverage]
	internal sealed class RequiresLocationAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Event | AttributeTargets.Interface, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class SkipLocalsInitAttribute : Attribute
	{
	}
}