Decompiled source of WintryMonstrosities v0.1.1

WintryMonstrosities.dll

Decompiled a day ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
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 HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using REPOLib.Modules;
using REPOLib.Objects.Sdk;
using Sirenix.Utilities;
using UnityEngine;
using UnityEngine.AI;
using WintryMonstrosities.NetworkPrefabs;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("")]
[assembly: AssemblyCompany("BLOKBUSTR")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("0.1.1.0")]
[assembly: AssemblyInformationalVersion("0.1.1+963f1ee5969a4921952d122afef073e59f9ae01f")]
[assembly: AssemblyProduct("WintryMonstrosities")]
[assembly: AssemblyTitle("WintryMonstrosities")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.1.1.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

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

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

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace WintryMonstrosities
{
	public class DebugHelperPatches
	{
	}
	[ExecuteInEditMode]
	public class EditorElfMeshHelper : MonoBehaviour
	{
		public EnemyElfAnim enemyElfAnim;

		public bool enableDecoratorMeshes;

		public bool enableTrumpeterMeshes;

		public bool enableToymakerMeshes;

		private void Awake()
		{
			if (!Application.isEditor)
			{
				WintryMonstrosities.DebugElf("Destroyed EditorElfMeshHelper");
				Object.Destroy((Object)(object)this);
			}
		}

		private void OnValidate()
		{
			if (!Object.op_Implicit((Object)(object)enemyElfAnim))
			{
				return;
			}
			GameObject[] decoratorObjects = enemyElfAnim.decoratorObjects;
			foreach (GameObject val in decoratorObjects)
			{
				if (Object.op_Implicit((Object)(object)val))
				{
					val.SetActive(enableDecoratorMeshes);
				}
			}
			GameObject[] trumpeterObjects = enemyElfAnim.trumpeterObjects;
			foreach (GameObject val2 in trumpeterObjects)
			{
				if (Object.op_Implicit((Object)(object)val2))
				{
					val2.SetActive(enableTrumpeterMeshes);
				}
			}
			GameObject[] toymakerObjects = enemyElfAnim.toymakerObjects;
			foreach (GameObject val3 in toymakerObjects)
			{
				if (Object.op_Implicit((Object)(object)val3))
				{
					val3.SetActive(enableToymakerMeshes);
				}
			}
		}
	}
	public class EnemyElf : MonoBehaviour
	{
		public enum State
		{
			Spawn,
			Idle,
			IdleBreaker,
			Move,
			Investigate,
			Notice,
			Flee,
			WeaponPrepare,
			WeaponDeploy,
			GunLoad,
			GunChase,
			GunShoot,
			GunUnload,
			Stun,
			Despawn
		}

		public enum Role
		{
			Decorator,
			Trumpeter,
			Toymaker
		}

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

			private object <>2__current;

			public EnemyElf <>4__this;

			private bool[] <array>5__1;

			private List<PlayerAvatar> <chaseVisionList>5__2;

			private int <num2>5__3;

			private float <closest>5__4;

			private float <radius>5__5;

			private Collider[] <array2>5__6;

			private Collider[] <>s__7;

			private int <>s__8;

			private Collider <collider>5__9;

			private PhysGrabObject <componentInParent>5__10;

			private Vector3 <direction>5__11;

			private RaycastHit[] <array3>5__12;

			private bool <flag>5__13;

			private int <num>5__14;

			private RaycastHit[] <array4>5__15;

			private int <j>5__16;

			private RaycastHit <raycastHit>5__17;

			private PhysGrabObject <componentInParent2>5__18;

			private List<PlayerAvatar>.Enumerator <>s__19;

			private PlayerAvatar <player2>5__20;

			private List<PlayerAvatar>.Enumerator <>s__21;

			private PlayerAvatar <player3>5__22;

			private bool <flag2>5__23;

			private int <viewID2>5__24;

			private float <num3>5__25;

			private bool <flag3>5__26;

			private bool <flag4>5__27;

			private Transform <transform1>5__28;

			private Transform <transform2>5__29;

			private Vector3 <direction2>5__30;

			private Collider[] <array5>5__31;

			private Collider[] <array2>5__32;

			private Collider[] <>s__33;

			private int <>s__34;

			private Collider <collider2>5__35;

			private RaycastHit[] <array6>5__36;

			private float <num4>5__37;

			private RaycastHit[] <array4>5__38;

			private int <i>5__39;

			private RaycastHit <raycastHit2>5__40;

			private float <num5>5__41;

			private float <num6>5__42;

			private bool <flag5>5__43;

			private bool <flag6>5__44;

			private bool <flag7>5__45;

			private List<PlayerAvatar>.Enumerator <>s__46;

			private PlayerAvatar <p>5__47;

			private float <sqrMagnitude>5__48;

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

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

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

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<array>5__1 = null;
				<chaseVisionList>5__2 = null;
				<array2>5__6 = null;
				<>s__7 = null;
				<collider>5__9 = null;
				<componentInParent>5__10 = null;
				<array3>5__12 = null;
				<array4>5__15 = null;
				<componentInParent2>5__18 = null;
				<>s__19 = default(List<PlayerAvatar>.Enumerator);
				<player2>5__20 = null;
				<>s__21 = default(List<PlayerAvatar>.Enumerator);
				<player3>5__22 = null;
				<transform1>5__28 = null;
				<transform2>5__29 = null;
				<array5>5__31 = null;
				<array2>5__32 = null;
				<>s__33 = null;
				<collider2>5__35 = null;
				<array6>5__36 = null;
				<array4>5__38 = null;
				<>s__46 = default(List<PlayerAvatar>.Enumerator);
				<p>5__47 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0f4a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0f54: Expected O, but got Unknown
				//IL_0169: Unknown result type (might be due to invalid IL or missing references)
				//IL_0174: Unknown result type (might be due to invalid IL or missing references)
				//IL_05df: Unknown result type (might be due to invalid IL or missing references)
				//IL_05f4: Unknown result type (might be due to invalid IL or missing references)
				//IL_0e78: Unknown result type (might be due to invalid IL or missing references)
				//IL_0e88: Unknown result type (might be due to invalid IL or missing references)
				//IL_0e8d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0e92: Unknown result type (might be due to invalid IL or missing references)
				//IL_021e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0233: Unknown result type (might be due to invalid IL or missing references)
				//IL_0238: Unknown result type (might be due to invalid IL or missing references)
				//IL_023d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0253: Unknown result type (might be due to invalid IL or missing references)
				//IL_0259: Unknown result type (might be due to invalid IL or missing references)
				//IL_0274: Unknown result type (might be due to invalid IL or missing references)
				//IL_0ee7: Unknown result type (might be due to invalid IL or missing references)
				//IL_0eec: Unknown result type (might be due to invalid IL or missing references)
				//IL_03e7: Unknown result type (might be due to invalid IL or missing references)
				//IL_03f2: Unknown result type (might be due to invalid IL or missing references)
				//IL_06cd: Unknown result type (might be due to invalid IL or missing references)
				//IL_06e2: Unknown result type (might be due to invalid IL or missing references)
				//IL_06e7: Unknown result type (might be due to invalid IL or missing references)
				//IL_06ec: Unknown result type (might be due to invalid IL or missing references)
				//IL_0702: Unknown result type (might be due to invalid IL or missing references)
				//IL_0717: Unknown result type (might be due to invalid IL or missing references)
				//IL_02ca: Unknown result type (might be due to invalid IL or missing references)
				//IL_02cf: Unknown result type (might be due to invalid IL or missing references)
				//IL_0889: Unknown result type (might be due to invalid IL or missing references)
				//IL_088f: Unknown result type (might be due to invalid IL or missing references)
				//IL_08af: Unknown result type (might be due to invalid IL or missing references)
				//IL_08f5: Unknown result type (might be due to invalid IL or missing references)
				//IL_08fa: Unknown result type (might be due to invalid IL or missing references)
				//IL_0a86: Unknown result type (might be due to invalid IL or missing references)
				//IL_0a91: Unknown result type (might be due to invalid IL or missing references)
				//IL_09af: Unknown result type (might be due to invalid IL or missing references)
				//IL_09ba: Unknown result type (might be due to invalid IL or missing references)
				//IL_0b5a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0b61: Invalid comparison between Unknown and I4
				//IL_0bb3: Unknown result type (might be due to invalid IL or missing references)
				//IL_0bba: Invalid comparison between Unknown and I4
				//IL_0c66: Unknown result type (might be due to invalid IL or missing references)
				//IL_0c6d: Invalid comparison between Unknown and I4
				//IL_0ccf: Unknown result type (might be due to invalid IL or missing references)
				//IL_0cd6: Invalid comparison between Unknown and I4
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					if (GameManager.Multiplayer() && !PhotonNetwork.IsMasterClient)
					{
						return false;
					}
					break;
				case 1:
					<>1__state = -1;
					break;
				case 2:
					<>1__state = -1;
					break;
				}
				if (<>4__this.enemyVision.DisableTimer > 0f || EnemyDirector.instance.debugNoVision)
				{
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
				if (<>4__this.currentState != State.GunChase)
				{
					return false;
				}
				if (<>4__this.currentState == State.GunChase && <>4__this.gunTimer > 0f)
				{
					<array>5__1 = new bool[GameDirector.instance.PlayerList.Count];
					if (<>4__this.enemyVision.PhysObjectVision)
					{
						<radius>5__5 = <>4__this.enemyVision.PhysObjectVisionRadius;
						if (<>4__this.enemyVision.PhysObjectVisionRadiusOverride > 0f)
						{
							<radius>5__5 = <>4__this.enemyVision.PhysObjectVisionRadiusOverride;
						}
						<array2>5__6 = Physics.OverlapSphere(<>4__this.enemyVision.VisionTransform.position, <radius>5__5, LayerMask.op_Implicit(SemiFunc.LayerMaskGetPhysGrabObject()));
						<>s__7 = <array2>5__6;
						for (<>s__8 = 0; <>s__8 < <>s__7.Length; <>s__8++)
						{
							<collider>5__9 = <>s__7[<>s__8];
							if (((Component)<collider>5__9).CompareTag("Phys Grab Object"))
							{
								<componentInParent>5__10 = ((Component)<collider>5__9).GetComponentInParent<PhysGrabObject>();
								if (Object.op_Implicit((Object)(object)<componentInParent>5__10) && <componentInParent>5__10.playerGrabbing.Count > 0)
								{
									<direction>5__11 = <componentInParent>5__10.centerPoint - <>4__this.enemyVision.VisionTransform.position;
									<array3>5__12 = Physics.RaycastAll(<>4__this.enemyVision.VisionTransform.position, <direction>5__11, ((Vector3)(ref <direction>5__11)).magnitude, LayerMask.op_Implicit(<>4__this.enemy.VisionMask), (QueryTriggerInteraction)1);
									<flag>5__13 = true;
									if (<array3>5__12.Length != 0)
									{
										<array4>5__15 = <array3>5__12;
										for (<j>5__16 = 0; <j>5__16 < <array4>5__15.Length; <j>5__16++)
										{
											<raycastHit>5__17 = <array4>5__15[<j>5__16];
											if (((Component)((RaycastHit)(ref <raycastHit>5__17)).transform).CompareTag("Phys Grab Object") || ((Component)((RaycastHit)(ref <raycastHit>5__17)).transform).CompareTag("Enemy"))
											{
												<componentInParent2>5__18 = ((Component)((RaycastHit)(ref <raycastHit>5__17)).transform).GetComponentInParent<PhysGrabObject>();
												if (Object.op_Implicit((Object)(object)<componentInParent2>5__18) && ((Object)(object)<componentInParent2>5__18 == (Object)(object)<componentInParent>5__10 || (<>4__this.enemy.HasRigidbody && (Object)(object)((Component)((RaycastHit)(ref <raycastHit>5__17)).transform).GetComponentInParent<EnemyRigidbody>() == (Object)(object)<>4__this.enemy.Rigidbody)))
												{
													continue;
												}
												<componentInParent2>5__18 = null;
											}
											<flag>5__13 = false;
										}
										<array4>5__15 = null;
									}
									if (<flag>5__13 && Vector3.Dot(<>4__this.enemyVision.VisionTransform.forward, ((Vector3)(ref <direction>5__11)).normalized) >= <>4__this.enemyVision.PhysObjectVisionDot)
									{
										<num>5__14 = 0;
										<>s__19 = GameDirector.instance.PlayerList.GetEnumerator();
										try
										{
											while (<>s__19.MoveNext())
											{
												<player2>5__20 = <>s__19.Current;
												if ((Object)(object)<player2>5__20 == (Object)(object)<componentInParent>5__10.playerGrabbing[0].playerAvatar)
												{
													<array>5__1[<num>5__14] = true;
												}
												<num>5__14++;
												<player2>5__20 = null;
											}
										}
										finally
										{
											((IDisposable)<>s__19).Dispose();
										}
										<>s__19 = default(List<PlayerAvatar>.Enumerator);
										<componentInParent>5__10 = null;
										<array3>5__12 = null;
										<collider>5__9 = null;
									}
								}
							}
						}
						<>s__7 = null;
						<array2>5__6 = null;
					}
					<chaseVisionList>5__2 = new List<PlayerAvatar>();
					<num2>5__3 = 0;
					<>s__21 = GameDirector.instance.PlayerList.GetEnumerator();
					try
					{
						while (<>s__21.MoveNext())
						{
							<player3>5__22 = <>s__21.Current;
							<flag2>5__23 = false;
							if (<player3>5__22.isDisabled)
							{
								continue;
							}
							<viewID2>5__24 = <player3>5__22.photonView.ViewID;
							if (<player3>5__22.enemyVisionFreezeTimer > 0f)
							{
								<num2>5__3++;
								continue;
							}
							<>4__this.VisionTriggered[<viewID2>5__24] = false;
							<num3>5__25 = Vector3.Distance(<>4__this.enemyVision.VisionTransform.position, <player3>5__22.PlayerVisionTarget.VisionTransform.position);
							if (!<array>5__1[<num2>5__3] && <num3>5__25 > <>4__this.enemyVision.VisionDistance)
							{
								continue;
							}
							<flag3>5__26 = <player3>5__22.isCrawling;
							<flag4>5__27 = <player3>5__22.isCrouching;
							if (<player3>5__22.isTumbling)
							{
								<flag4>5__27 = true;
								<flag3>5__26 = false;
							}
							if (<>4__this.enemyVision.StandOverrideTimer > 0f)
							{
								<flag4>5__27 = false;
								<flag3>5__26 = false;
							}
							<transform1>5__28 = null;
							<transform2>5__29 = null;
							<direction2>5__30 = ((Component)<player3>5__22.PlayerVisionTarget.VisionTransform).transform.position - <>4__this.enemyVision.VisionTransform.position;
							<array5>5__31 = Physics.OverlapSphere(<>4__this.enemyVision.VisionTransform.position, 0.01f, LayerMask.op_Implicit(<>4__this.enemy.VisionMask));
							if (<array5>5__31.Length != 0)
							{
								<array2>5__32 = <array5>5__31;
								<>s__33 = <array2>5__32;
								for (<>s__34 = 0; <>s__34 < <>s__33.Length; <>s__34++)
								{
									<collider2>5__35 = <>s__33[<>s__34];
									if (!((Component)((Component)<collider2>5__35).transform).CompareTag("Enemy"))
									{
										if (((Component)((Component)<collider2>5__35).transform).CompareTag("Player"))
										{
											<transform1>5__28 = ((Component)<collider2>5__35).transform;
										}
										if (Object.op_Implicit((Object)(object)((Component)((Component)<collider2>5__35).transform).GetComponentInParent<PlayerTumble>()))
										{
											<transform1>5__28 = ((Component)<collider2>5__35).transform;
										}
										if (!Object.op_Implicit((Object)(object)((Component)((Component)<collider2>5__35).transform).GetComponentInParent<EnemyRigidbody>()))
										{
											<transform2>5__29 = ((Component)<collider2>5__35).transform;
										}
									}
									<collider2>5__35 = null;
								}
								<>s__33 = null;
								<array2>5__32 = null;
							}
							if (!Object.op_Implicit((Object)(object)<transform2>5__29))
							{
								<array6>5__36 = Physics.RaycastAll(<>4__this.enemyVision.VisionTransform.position, <direction2>5__30, <>4__this.enemyVision.VisionDistance, LayerMask.op_Implicit(<>4__this.enemy.VisionMask), (QueryTriggerInteraction)1);
								<num4>5__37 = 1000f;
								<array4>5__38 = <array6>5__36;
								<i>5__39 = 0;
								while (<i>5__39 < <array4>5__38.Length)
								{
									<raycastHit2>5__40 = <array4>5__38[<i>5__39];
									if (!((Component)((RaycastHit)(ref <raycastHit2>5__40)).transform).CompareTag("Enemy"))
									{
										if (((Component)((RaycastHit)(ref <raycastHit2>5__40)).transform).CompareTag("Player"))
										{
											<transform1>5__28 = ((RaycastHit)(ref <raycastHit2>5__40)).transform;
										}
										if (!Object.op_Implicit((Object)(object)((Component)((RaycastHit)(ref <raycastHit2>5__40)).transform).GetComponentInParent<EnemyRigidbody>()))
										{
											if (Object.op_Implicit((Object)(object)((Component)((RaycastHit)(ref <raycastHit2>5__40)).transform).GetComponentInParent<PlayerTumble>()))
											{
												<transform1>5__28 = ((RaycastHit)(ref <raycastHit2>5__40)).transform;
											}
											<num5>5__41 = Vector3.Distance(<>4__this.enemyVision.VisionTransform.position, ((RaycastHit)(ref <raycastHit2>5__40)).point);
											if (<num5>5__41 < <num4>5__37)
											{
												<num4>5__37 = <num5>5__41;
												<transform2>5__29 = ((RaycastHit)(ref <raycastHit2>5__40)).transform;
											}
										}
									}
									<i>5__39++;
								}
								<array6>5__36 = null;
								<array4>5__38 = null;
							}
							if (<array>5__1[<num2>5__3] || (Object.op_Implicit((Object)(object)<transform1>5__28) && (Object)(object)<transform1>5__28 == (Object)(object)<transform2>5__29))
							{
								<num6>5__42 = Vector3.Dot(<>4__this.enemyVision.VisionTransform.forward, ((Vector3)(ref <direction2>5__30)).normalized);
								<flag5>5__43 = false;
								if (<flag4>5__27)
								{
									if (<num3>5__25 <= <>4__this.enemyVision.VisionDistanceCloseCrouch)
									{
										<flag5>5__43 = true;
									}
								}
								else if (<num3>5__25 <= <>4__this.enemyVision.VisionDistanceClose)
								{
									<flag5>5__43 = true;
								}
								if (<flag5>5__43)
								{
									<>4__this.VisionsTriggered[<viewID2>5__24] = <>4__this.enemyVision.VisionsToTrigger;
								}
								<flag6>5__44 = false;
								if (<flag3>5__26 && (int)<>4__this.enemy.CurrentState != 10)
								{
									if (<num6>5__42 >= <>4__this.enemyVision.VisionDotCrawl)
									{
										<flag6>5__44 = true;
									}
								}
								else if (<flag4>5__27 && (int)<>4__this.enemy.CurrentState != 10)
								{
									if (<num6>5__42 >= <>4__this.enemyVision.VisionDotCrouch)
									{
										<flag6>5__44 = true;
									}
								}
								else if (<num6>5__42 >= <>4__this.enemyVision.VisionDotStanding)
								{
									<flag6>5__44 = true;
								}
								if (<array>5__1[<num2>5__3] | <flag6>5__44 | <flag5>5__43)
								{
									<flag2>5__23 = true;
									<flag7>5__45 = false;
									if (<flag3>5__26 && (int)<>4__this.enemy.CurrentState != 10)
									{
										if (<>4__this.VisionsTriggered[<viewID2>5__24] >= <>4__this.enemyVision.VisionsToTriggerCrawl)
										{
											<flag7>5__45 = true;
										}
									}
									else if (<flag4>5__27 && (int)<>4__this.enemy.CurrentState != 10)
									{
										if (<>4__this.VisionsTriggered[<viewID2>5__24] >= <>4__this.enemyVision.VisionsToTriggerCrouch)
										{
											<flag7>5__45 = true;
										}
									}
									else if (<>4__this.VisionsTriggered[<viewID2>5__24] >= <>4__this.enemyVision.VisionsToTrigger)
									{
										<flag7>5__45 = true;
									}
									if (<flag7>5__45 | <flag5>5__43)
									{
										<chaseVisionList>5__2.Add(<player3>5__22);
									}
								}
							}
							if (<flag2>5__23)
							{
								<>4__this.VisionsTriggered[<viewID2>5__24]++;
							}
							else
							{
								<>4__this.VisionsTriggered[<viewID2>5__24] = 0;
							}
							<num2>5__3++;
							<transform1>5__28 = null;
							<transform2>5__29 = null;
							<array5>5__31 = null;
							<player3>5__22 = null;
						}
					}
					finally
					{
						((IDisposable)<>s__21).Dispose();
					}
					<>s__21 = default(List<PlayerAvatar>.Enumerator);
					<closest>5__4 = float.MaxValue;
					<>s__46 = <chaseVisionList>5__2.GetEnumerator();
					try
					{
						while (<>s__46.MoveNext())
						{
							<p>5__47 = <>s__46.Current;
							Vector3 val = ((Component)<>4__this).transform.position - ((Component)<p>5__47).transform.position;
							<sqrMagnitude>5__48 = ((Vector3)(ref val)).sqrMagnitude;
							if (!(<sqrMagnitude>5__48 >= <closest>5__4))
							{
								<closest>5__4 = <sqrMagnitude>5__48;
								<>4__this.playerTarget = <p>5__47;
								<>4__this.playerTargetKnownPosition = ((Component)<p>5__47).transform.position;
								<p>5__47 = null;
							}
						}
					}
					finally
					{
						((IDisposable)<>s__46).Dispose();
					}
					<>s__46 = default(List<PlayerAvatar>.Enumerator);
					<array>5__1 = null;
					<chaseVisionList>5__2 = null;
				}
				<>2__current = (object)new WaitForSeconds(<>4__this.enemyVision.VisionCheckTime);
				<>1__state = 2;
				return true;
			}

			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 <GrenadeThrowLogic>d__77 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public ItemGrenadeOrnament grenade;

			public EnemyElf <>4__this;

			private Vector3 <vector>5__1;

			private float <throwForce>5__2;

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

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

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

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

			private bool MoveNext()
			{
				//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
				//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
				//IL_0108: 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)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = null;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					break;
				case 2:
					<>1__state = -1;
					break;
				}
				if (!grenade.physGrabObject.spawned || grenade.rb.isKinematic)
				{
					<>2__current = null;
					<>1__state = 2;
					return true;
				}
				grenade.itemToggle.ToggleItem(true, -1);
				grenade.tickTime = Random.Range(1f, 3f);
				<vector>5__1 = <>4__this.bodyRotationTarget * Vector3.forward + Vector3.up * Random.Range(0.3f, 0.5f);
				<throwForce>5__2 = 5f;
				grenade.rb.AddForce(((Vector3)(ref <vector>5__1)).normalized * <throwForce>5__2, (ForceMode)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();
			}
		}

		[Space]
		public State currentState;

		public Role currentRole;

		private bool stateImpulse = true;

		private float stateTimer;

		private bool visionPrevious;

		private float visionTimer;

		private float idleBreakerTimer;

		private bool idleBreakerImpulse;

		private float eyelidTwitchTimer;

		private bool notifyDelay;

		private float notifyDelayTimer;

		private bool gunPrimed;

		private float gunTimer;

		[Space]
		public Enemy enemy;

		public EnemyElfAnim anim;

		public EnemyElfAlwaysActive enemyElfAlwaysActive;

		private EnemyHealth enemyHealth;

		private EnemyStateStunned stateStunned;

		private EnemyVision enemyVision;

		internal PhotonView photonView;

		internal int directorIndex;

		private Vector3 agentDestination;

		internal PlayerAvatar playerTarget;

		private Vector3 playerTargetKnownPosition;

		public Dictionary<int, int> VisionsTriggered = new Dictionary<int, int>();

		public Dictionary<int, bool> VisionTriggered = new Dictionary<int, bool>();

		[Space]
		private Quaternion bodyRotationTarget;

		public SpringQuaternion bodyRotationSpring;

		[Space]
		public Transform headTransform;

		public Transform headOriginalRotation;

		public SpringQuaternion headRotationSpring;

		[Space]
		public GameObject leftEye;

		public GameObject rightEye;

		[Space]
		public Transform gunAimTransform;

		public Transform gunTipTransform;

		public GameObject gunHurtCollider;

		public GameObject gunHurtColliderWave;

		public float gunRecoilForce = 25f;

		private float gunHurtColliderTimer;

		private float gunHurtColliderWaveTimer;

		public Transform gunShootParticlesTransform;

		public List<ParticleSystem> gunShootParticles;

		private float shootInvincibilityTimer;

		[Space]
		[SerializeField]
		private List<NetworkPrefabContent> ornamentNetworkPrefabs;

		[SerializeField]
		private List<NetworkPrefabContent> toyCarNetworkPrefabs;

		private void Awake()
		{
			photonView = ((Component)this).GetComponent<PhotonView>();
			enemyHealth = ((Component)this).GetComponent<EnemyHealth>();
			stateStunned = ((Component)this).GetComponent<EnemyStateStunned>();
			enemyVision = ((Component)this).GetComponent<EnemyVision>();
		}

		private void Start()
		{
			if (EnemyElfDirector.instance.setup)
			{
				EnemyElfDirector.instance.SetupSingle(this);
			}
		}

		private void Update()
		{
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Invalid comparison between Unknown and I4
			BodyRotationLogic();
			HeadRotationLogic();
			State state;
			if (notifyDelay && notifyDelayTimer > 0f)
			{
				notifyDelayTimer -= Time.deltaTime;
				if (notifyDelayTimer <= 0f)
				{
					notifyDelay = false;
					state = currentState;
					if ((uint)(state - 1) <= 3u)
					{
						UpdateState(State.Notice);
					}
				}
			}
			if (currentState != State.GunShoot)
			{
				if (gunHurtColliderTimer > 0f)
				{
					gunHurtColliderTimer -= Time.deltaTime;
					if (gunHurtColliderTimer <= 0f)
					{
						gunHurtCollider.gameObject.SetActive(false);
					}
				}
				if (gunHurtColliderWaveTimer > 0f)
				{
					gunHurtColliderWaveTimer -= Time.deltaTime;
					if (gunHurtColliderWaveTimer <= 0f)
					{
						gunHurtColliderWave.gameObject.SetActive(false);
					}
				}
			}
			if (!Object.op_Implicit((Object)(object)EnemyElfDirector.instance) || !EnemyElfDirector.instance.setup || !SemiFunc.IsMasterClientOrSingleplayer())
			{
				return;
			}
			if ((int)enemy.CurrentState == 11)
			{
				UpdateState(State.Despawn);
			}
			if (enemy.IsStunned())
			{
				UpdateState(State.Stun);
			}
			EyelidTwitchLogic();
			if (gunPrimed)
			{
				GunLogic();
			}
			if (visionTimer > 0f)
			{
				visionTimer -= Time.deltaTime;
			}
			if (shootInvincibilityTimer > 0f)
			{
				shootInvincibilityTimer -= Time.deltaTime;
				if (shootInvincibilityTimer <= 0f)
				{
					enemyHealth.impactHurt = true;
				}
			}
			switch (currentState)
			{
			case State.Spawn:
				StateSpawn();
				break;
			case State.Idle:
				StateIdle();
				IdleBreakerLogic();
				break;
			case State.IdleBreaker:
				StateIdleBreaker();
				break;
			case State.Move:
				StateMove();
				break;
			case State.Investigate:
				StateInvestigate();
				break;
			case State.Notice:
				StateNotice();
				break;
			case State.Flee:
				StateFlee();
				break;
			case State.WeaponPrepare:
				StateWeaponPrepare();
				break;
			case State.WeaponDeploy:
				StateWeaponDeploy();
				break;
			case State.GunLoad:
				StateGunLoad();
				break;
			case State.GunChase:
				StateGunChase();
				GunAimLogic();
				break;
			case State.GunShoot:
				StateGunShoot();
				break;
			case State.Stun:
				StateStun();
				break;
			case State.Despawn:
				StateDespawn();
				break;
			}
			state = currentState;
			if ((uint)(state - 7) <= 3u)
			{
				EnemyElfDirector.instance.PauseSpawnedTimers();
			}
		}

		private void StateSpawn()
		{
			if (stateImpulse)
			{
				stateImpulse = false;
				stateTimer = 1f;
			}
			stateTimer -= Time.deltaTime;
			if (stateTimer <= 0f)
			{
				UpdateState(State.Idle);
			}
		}

		private void StateIdle()
		{
			//IL_0046: 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_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			if (stateImpulse)
			{
				stateImpulse = false;
				ResetNavMeshAgent();
			}
			if (EnemyElfDirector.instance.currentState == EnemyElfDirector.State.AllInvestigate)
			{
				UpdateState(State.Investigate);
			}
			Vector3 val = ((Component)enemy.Rigidbody).transform.position - EnemyElfDirector.instance.destinations[directorIndex];
			if (((Vector3)(ref val)).sqrMagnitude > 4f)
			{
				UpdateState(State.Move);
			}
		}

		private void StateIdleBreaker()
		{
			if (stateImpulse)
			{
				stateImpulse = false;
				stateTimer = Random.Range(1f, 2f);
				anim.EventNeckCrack();
			}
			stateTimer -= Time.deltaTime;
			if (stateTimer <= 0f)
			{
				anim.EventNeckCrack();
				UpdateState(State.Idle);
			}
		}

		private void StateMove()
		{
			//IL_0030: 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_0046: 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_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: 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_00b5: 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)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			if (stateImpulse)
			{
				stateImpulse = false;
				stateTimer = 2f;
			}
			agentDestination = EnemyElfDirector.instance.destinations[directorIndex];
			enemy.NavMeshAgent.SetDestination(agentDestination);
			SemiFunc.EnemyCartJump(enemy);
			Vector3 val = ((Component)enemy.Rigidbody).transform.position - agentDestination;
			if (((Vector3)(ref val)).sqrMagnitude <= 0.25f)
			{
				UpdateState(State.Idle);
				return;
			}
			val = ((Component)enemy.Rigidbody).transform.position - agentDestination;
			if (((Vector3)(ref val)).sqrMagnitude <= 4f)
			{
				stateTimer -= Time.deltaTime;
				if (stateTimer <= 0f)
				{
					UpdateState(State.Idle);
				}
			}
		}

		private void StateInvestigate()
		{
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			if (stateImpulse)
			{
				stateImpulse = false;
				stateTimer = 2f;
			}
			agentDestination = ((EnemyElfDirector.instance.currentState == EnemyElfDirector.State.AllInvestigate) ? EnemyElfDirector.instance.allInvestigatePosition : enemy.StateInvestigate.onInvestigateTriggeredPosition);
			enemy.NavMeshAgent.SetDestination(agentDestination);
			SemiFunc.EnemyCartJump(enemy);
			Vector3 val = ((Component)enemy.Rigidbody).transform.position - agentDestination;
			if (((Vector3)(ref val)).sqrMagnitude <= 0.25f)
			{
				UpdateState(State.IdleBreaker);
				idleBreakerTimer += 10f;
				return;
			}
			val = ((Component)enemy.Rigidbody).transform.position - agentDestination;
			if (((Vector3)(ref val)).sqrMagnitude <= 4f)
			{
				stateTimer -= Time.deltaTime;
				if (stateTimer <= 0f)
				{
					UpdateState(State.IdleBreaker);
					idleBreakerTimer += 10f;
				}
			}
		}

		private void StateNotice()
		{
			//IL_0051: 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)
			if (stateImpulse)
			{
				stateImpulse = false;
				stateTimer = Random.Range(0.4f, 0.8f);
				ResetNavMeshAgent();
				anim.EventNotice();
				EnemyElfDirector.instance.NotifyNearby(playerTarget, ((Component)enemy).transform.position);
				playerTargetKnownPosition = ((Component)playerTarget).transform.position;
			}
			stateTimer -= Time.deltaTime;
			if (!(stateTimer > 0f))
			{
				switch (currentRole)
				{
				case Role.Decorator:
				case Role.Toymaker:
					UpdateState(State.WeaponPrepare);
					break;
				case Role.Trumpeter:
					UpdateState(State.Flee);
					break;
				}
			}
		}

		private void StateFlee()
		{
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_0180: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			if (stateImpulse)
			{
				stateTimer = Random.Range(3f, 6f);
				bool flag = false;
				LevelPoint val = SemiFunc.LevelPointGetFurthestFromPlayer(((Component)this).transform.position, 5f);
				NavMeshHit val2 = default(NavMeshHit);
				if (Object.op_Implicit((Object)(object)val) && NavMesh.SamplePosition(((Component)val).transform.position + Random.insideUnitSphere * 3f, ref val2, 5f, -1) && Physics.Raycast(((NavMeshHit)(ref val2)).position, Vector3.down, 5f, LayerMask.GetMask(new string[1] { "Default" })))
				{
					agentDestination = ((NavMeshHit)(ref val2)).position;
					flag = true;
				}
				if (!flag)
				{
					return;
				}
				stateImpulse = false;
				if (currentRole == Role.Trumpeter)
				{
					EnemyDirector.instance.SetInvestigate(((Component)playerTarget).transform.position, 35f, false);
					EnemyElfDirector.instance.Investigate(((Component)playerTarget).transform.position);
					anim.EventTrumpetAlert();
				}
			}
			enemy.NavMeshAgent.SetDestination(agentDestination);
			enemy.NavMeshAgent.OverrideAgent(5f, 15f, 0.25f);
			SemiFunc.EnemyCartJump(enemy);
			stateTimer -= Time.deltaTime;
			Vector3 val3 = ((Component)this).transform.position - agentDestination;
			if (((Vector3)(ref val3)).sqrMagnitude <= 4f || stateTimer <= 0f)
			{
				switch (currentRole)
				{
				case Role.Decorator:
				case Role.Toymaker:
					UpdateState(State.IdleBreaker);
					idleBreakerTimer += 10f;
					break;
				case Role.Trumpeter:
					UpdateState(State.GunLoad);
					break;
				}
			}
		}

		private void StateWeaponPrepare()
		{
			if (stateImpulse)
			{
				stateImpulse = false;
				stateTimer = Random.Range(3f, 5f);
			}
			stateTimer -= Time.deltaTime;
			if (stateTimer <= 0f)
			{
				UpdateState(State.WeaponDeploy);
			}
		}

		private void StateWeaponDeploy()
		{
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			if (stateImpulse)
			{
				stateImpulse = false;
				stateTimer = 2f;
				switch (currentRole)
				{
				case Role.Decorator:
				case Role.Toymaker:
					if (SemiFunc.IsMasterClientOrSingleplayer() && !LinqExtensions.IsNullOrEmpty<NetworkPrefabContent>((IList<NetworkPrefabContent>)ornamentNetworkPrefabs))
					{
						Vector3 position = ((Component)this).transform.position + Vector3.up * 0.5f + bodyRotationTarget * Vector3.forward * 0.3f;
						int num = Random.Range(0, ornamentNetworkPrefabs.Count);
						WintryMonstrosities.DebugElf($"Chosen random grenade: {num}", this);
						NetworkPrefabContent networkPrefabContent = ornamentNetworkPrefabs[num];
						GameObject val = networkPrefabContent.SpawnNetworkPrefab(position, bodyRotationTarget);
						if ((Object)(object)val != (Object)null)
						{
							ItemGrenadeOrnament component = val.GetComponent<ItemGrenadeOrnament>();
							((MonoBehaviour)this).StartCoroutine(GrenadeThrowLogic(component));
						}
					}
					else
					{
						WintryMonstrosities.Logger.LogWarning((object)"ornamentNetworkPrefabs is empty!");
					}
					break;
				}
			}
			stateTimer -= Time.deltaTime;
			if (stateTimer <= 0f)
			{
				UpdateState(State.Flee);
			}
		}

		private void StateGunLoad()
		{
			if (stateImpulse)
			{
				stateImpulse = false;
				stateTimer = 3f;
				ResetNavMeshAgent();
			}
			stateTimer -= Time.deltaTime;
			if (stateTimer <= 0f)
			{
				UpdateState(State.GunChase);
			}
		}

		private void StateGunChase()
		{
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0154: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_017e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0198: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0208: Unknown result type (might be due to invalid IL or missing references)
			//IL_020d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0212: 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_01e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
			if (stateImpulse)
			{
				stateImpulse = false;
				stateTimer = 0f;
				agentDestination = playerTargetKnownPosition;
				((MonoBehaviour)this).StartCoroutine(ChaseVision());
			}
			agentDestination = playerTargetKnownPosition;
			if (enemy.Jump.jumping)
			{
				enemy.NavMeshAgent.Disable(0.1f);
				((Component)this).transform.position = Vector3.MoveTowards(((Component)this).transform.position, agentDestination, 5f * Time.deltaTime);
			}
			else
			{
				enemy.NavMeshAgent.SetDestination(agentDestination);
			}
			enemy.NavMeshAgent.OverrideAgent(5f, 15f, 0.25f);
			SemiFunc.EnemyCartJump(enemy);
			Vector3 val = ((Component)this).transform.position - agentDestination;
			if (((Vector3)(ref val)).sqrMagnitude <= 225f && !gunPrimed)
			{
				gunPrimed = true;
				gunTimer = 5f;
				WintryMonstrosities.DebugElf("Started gun countdown", this);
			}
			val = ((Component)this).transform.position - ((Component)playerTarget).transform.position;
			if (!(((Vector3)(ref val)).sqrMagnitude > 4f))
			{
				if (((Component)playerTarget).transform.position.y > ((Component)enemy.Rigidbody).transform.position.y + 0.3f)
				{
					enemy.Jump.StuckTrigger(playerTarget.PlayerVisionTarget.VisionTransform.position - enemy.Vision.VisionTransform.position);
				}
				val = ((Component)this).transform.position - ((Component)playerTarget).transform.position;
				if (((Vector3)(ref val)).sqrMagnitude < 1f)
				{
					gunTimer = 0f;
				}
			}
		}

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

		private void StateGunShoot()
		{
			//IL_00a0: 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_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			if (stateImpulse)
			{
				stateImpulse = false;
				stateTimer = 0f;
				ResetNavMeshAgent();
				if (SemiFunc.IsMultiplayer())
				{
					photonView.RPC("ShootGunRPC", (RpcTarget)0, Array.Empty<object>());
				}
				else
				{
					ShootGunRPC();
				}
			}
			enemyHealth.impactHurt = false;
			shootInvincibilityTimer = 1f;
			enemy.Rigidbody.GrabRelease(true, 0.1f);
			enemy.Rigidbody.rb.AddForce(-gunTipTransform.forward * gunRecoilForce, (ForceMode)1);
			if (stateStunned.stunTimer < 3f)
			{
				stateStunned.stunTimer = 3f;
			}
			UpdateState(State.Stun);
		}

		private void StateStun()
		{
			if (stateImpulse)
			{
				stateImpulse = false;
				ResetNavMeshAgent();
			}
			if (!enemy.IsStunned())
			{
				UpdateState(State.Idle);
			}
		}

		private void StateDespawn()
		{
			if (stateImpulse)
			{
				stateImpulse = false;
				ResetNavMeshAgent();
				gunPrimed = false;
				gunTimer = 0f;
				WintryMonstrosities.DebugElf("StateDespawn has been called", this);
			}
		}

		public void UpdateState(State nextState)
		{
			if (currentState != nextState)
			{
				WintryMonstrosities.DebugElf($"{currentState} to {nextState}", this);
				currentState = nextState;
				stateImpulse = true;
				stateTimer = 0f;
				if (SemiFunc.IsMultiplayer())
				{
					photonView.RPC("UpdateStateRPC", (RpcTarget)1, new object[1] { nextState });
				}
			}
		}

		[PunRPC]
		private void UpdateStateRPC(State nextState, PhotonMessageInfo info = default(PhotonMessageInfo))
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			if (SemiFunc.MasterOnlyRPC(info))
			{
				WintryMonstrosities.DebugElf($"RPC {currentState} to {nextState}", this);
				currentState = nextState;
			}
		}

		public void OnSpawn()
		{
			if (SemiFunc.IsMasterClientOrSingleplayer() && SemiFunc.EnemySpawn(enemy))
			{
				EnemyElfDirector.instance.OnSpawn(this);
				UpdateState(State.Spawn);
			}
			anim.OnSpawn();
		}

		public void OnInvestigate()
		{
			if (SemiFunc.IsMasterClientOrSingleplayer())
			{
				State state = currentState;
				if ((uint)(state - 1) <= 2u)
				{
					UpdateState(State.Investigate);
				}
			}
		}

		public void OnVision()
		{
			if (!SemiFunc.IsMasterClientOrSingleplayer())
			{
				return;
			}
			State state = currentState;
			if ((uint)(state - 1) <= 3u)
			{
				UpdatePlayerTarget(enemy.Vision.onVisionTriggeredPlayer);
				WintryMonstrosities.DebugElf($"playerTarget? {Object.op_Implicit((Object)(object)playerTarget)}: {playerTarget}", this);
				if (Object.op_Implicit((Object)(object)playerTarget))
				{
					UpdateState(State.Notice);
				}
			}
		}

		public void OnHurt()
		{
			anim.EventHurt();
		}

		public void OnDeath()
		{
			//IL_002c: 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_013b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: 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)
			anim.EventDeath();
			GameDirector.instance.CameraShake.ShakeDistance(5f, 3f, 8f, ((Component)this).transform.position, 0.5f);
			GameDirector.instance.CameraImpact.ShakeDistance(5f, 3f, 8f, ((Component)this).transform.position, 0.1f);
			if (!SemiFunc.IsMasterClientOrSingleplayer())
			{
				return;
			}
			gunPrimed = false;
			gunTimer = 0f;
			UpdateState(State.Despawn);
			enemy.EnemyParent.Despawn();
			enemy.EnemyParent.SpawnedTimerSet(0f);
			if (enemy.Health.spawnValuableCurrent < enemy.Health.spawnValuableMax)
			{
				GameObject enemyValuableSmall = AssetManager.instance.enemyValuableSmall;
				if (SemiFunc.IsMultiplayer())
				{
					PhotonNetwork.Instantiate("Valuables/" + ((Object)enemyValuableSmall).name, enemy.CenterTransform.position, Quaternion.identity, (byte)0, (object[])null);
				}
				else
				{
					Object.Instantiate<GameObject>(enemyValuableSmall, enemy.CenterTransform.position, Quaternion.identity);
				}
				EnemyHealth health = enemy.Health;
				health.spawnValuableCurrent++;
			}
		}

		private void IdleBreakerLogic()
		{
			if (idleBreakerTimer > 0f)
			{
				idleBreakerTimer -= Time.deltaTime;
				if (idleBreakerTimer <= 0f)
				{
					SemiFunc.EnemyCartJumpReset(enemy);
					UpdateState(State.IdleBreaker);
					idleBreakerTimer = Random.Range(15f, 30f);
				}
			}
		}

		private void BodyRotationLogic()
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: 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_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)
			Quaternion val;
			if (Object.op_Implicit((Object)(object)playerTarget) && currentState == State.WeaponDeploy)
			{
				val = Quaternion.LookRotation(((Component)playerTarget).transform.position - ((Component)enemy.Rigidbody).transform.position);
				bodyRotationTarget = Quaternion.Euler(0f, ((Quaternion)(ref val)).eulerAngles.y, 0f);
			}
			else if (((Vector3)(ref enemy.NavMeshAgent.AgentVelocity)).magnitude > 0.1f)
			{
				val = Quaternion.LookRotation(((Vector3)(ref enemy.NavMeshAgent.AgentVelocity)).normalized);
				bodyRotationTarget = Quaternion.Euler(0f, ((Quaternion)(ref val)).eulerAngles.y, 0f);
			}
			((Component)this).transform.rotation = SemiFunc.SpringQuaternionGet(bodyRotationSpring, bodyRotationTarget, -1f);
		}

		private void HeadRotationLogic()
		{
			//IL_010f: 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_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: 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)
			//IL_00bf: 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_00c9: 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_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			if (currentState == State.IdleBreaker)
			{
				if (!idleBreakerImpulse)
				{
					idleBreakerImpulse = true;
				}
			}
			else
			{
				idleBreakerImpulse = false;
			}
			float num = ((currentState == State.Notice) ? 135f : 75f);
			bool flag = Object.op_Implicit((Object)(object)playerTarget);
			bool flag2 = flag;
			if (flag2)
			{
				bool flag3;
				switch (currentState)
				{
				case State.Notice:
				case State.WeaponPrepare:
				case State.WeaponDeploy:
				case State.GunChase:
					flag3 = true;
					break;
				default:
					flag3 = false;
					break;
				}
				flag2 = flag3;
			}
			if (flag2)
			{
				Vector3 val = playerTarget.PlayerVisionTarget.VisionTransform.position - headOriginalRotation.position;
				val = SemiFunc.ClampDirection(val, headOriginalRotation.forward, num);
				headTransform.rotation = SemiFunc.SpringQuaternionGet(headRotationSpring, Quaternion.LookRotation(val), -1f);
			}
			else
			{
				headTransform.rotation = SemiFunc.SpringQuaternionGet(headRotationSpring, headOriginalRotation.rotation, -1f);
			}
		}

		public void NoticeDelay()
		{
			if (SemiFunc.IsMasterClientOrSingleplayer())
			{
				notifyDelay = true;
				notifyDelayTimer = Random.Range(0.02f, 0.5f);
			}
		}

		private void GunLogic()
		{
			if (gunTimer >= 0f)
			{
				gunTimer -= Time.deltaTime;
				WintryMonstrosities.DebugElf($"gunTimer: {gunTimer}", this);
				if (gunTimer <= 0f)
				{
					gunPrimed = false;
					UpdateState(State.GunShoot);
					WintryMonstrosities.DebugElf("BOOM", this);
				}
			}
		}

		[IteratorStateMachine(typeof(<GrenadeThrowLogic>d__77))]
		private IEnumerator GrenadeThrowLogic(ItemGrenadeOrnament grenade)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <GrenadeThrowLogic>d__77(0)
			{
				<>4__this = this,
				grenade = grenade
			};
		}

		private void GunAimLogic()
		{
		}

		[PunRPC]
		private void ShootGunRPC(PhotonMessageInfo info = default(PhotonMessageInfo))
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: 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_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0124: Unknown result type (might be due to invalid IL or missing references)
			if (!SemiFunc.MasterOnlyRPC(info))
			{
				return;
			}
			gunHurtCollider.gameObject.SetActive(true);
			gunHurtColliderTimer = 0.05f;
			gunHurtColliderWave.gameObject.SetActive(true);
			gunHurtColliderWaveTimer = 0.2f;
			gunShootParticlesTransform.position = gunTipTransform.position;
			gunShootParticlesTransform.rotation = gunTipTransform.rotation;
			foreach (ParticleSystem gunShootParticle in gunShootParticles)
			{
				gunShootParticle.Play();
			}
			enemyElfAlwaysActive.TriggerGunEffect();
			anim.EventGunShoot(gunTipTransform.position);
			GameDirector.instance.CameraShake.ShakeDistance(5f, 3f, 15f, gunTipTransform.position, 0.5f);
			GameDirector.instance.CameraImpact.ShakeDistance(5f, 3f, 15f, gunTipTransform.position, 0.5f);
		}

		private void EyelidTwitchLogic()
		{
			//IL_0065: 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)
			if (!(eyelidTwitchTimer >= 0f))
			{
				return;
			}
			eyelidTwitchTimer -= Time.deltaTime;
			if (eyelidTwitchTimer <= 0f)
			{
				if (SemiFunc.IsMultiplayer())
				{
					photonView.RPC("EyelidTwitchRPC", (RpcTarget)0, Array.Empty<object>());
				}
				else
				{
					EyelidTwitchRPC();
				}
				eyelidTwitchTimer = Random.Range(1f, 60f);
			}
		}

		[PunRPC]
		private void EyelidTwitchRPC(PhotonMessageInfo info = default(PhotonMessageInfo))
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			if (SemiFunc.MasterOnlyRPC(info))
			{
				anim.EventEyelidTwitch();
				WintryMonstrosities.DebugElf("Triggered eyelid twitch", this);
			}
		}

		private void ResetNavMeshAgent()
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			enemy.NavMeshAgent.ResetPath();
			enemy.NavMeshAgent.Warp(((Component)enemy.Rigidbody).transform.position, false);
		}

		internal bool IsVisionBlocked()
		{
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: 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_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)playerTarget))
			{
				return true;
			}
			if (visionTimer <= 0f)
			{
				visionTimer = 0.25f;
				Vector3 val = playerTarget.PlayerVisionTarget.VisionTransform.position - enemy.CenterTransform.position;
				visionPrevious = Physics.Raycast(enemy.CenterTransform.position, val, ((Vector3)(ref val)).magnitude, LayerMask.GetMask(new string[1] { "Default" }), (QueryTriggerInteraction)1);
			}
			return visionPrevious;
		}

		internal void UpdatePlayerTarget(PlayerAvatar player)
		{
			if (SemiFunc.IsMasterClientOrSingleplayer())
			{
				if (SemiFunc.IsMultiplayer() && Object.op_Implicit((Object)(object)player) && (Object)(object)player != (Object)(object)playerTarget)
				{
					photonView.RPC("UpdatePlayerTargetRPC", (RpcTarget)1, new object[1] { player.photonView.ViewID });
				}
				playerTarget = player;
				WintryMonstrosities.DebugElf($"playerTarget: {playerTarget}", this);
			}
		}

		[PunRPC]
		private void UpdatePlayerTargetRPC(int photonViewID, PhotonMessageInfo info = default(PhotonMessageInfo))
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			if (SemiFunc.MasterOnlyRPC(info))
			{
				playerTarget = SemiFunc.PlayerAvatarGetFromPhotonID(photonViewID);
				WintryMonstrosities.DebugElf($"playerTarget: {playerTarget} (from RPC)", this);
			}
		}

		[PunRPC]
		public void EnemySetupRPC(int role, float pitch, PhotonMessageInfo info = default(PhotonMessageInfo))
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			if (SemiFunc.MasterOnlyRPC(info))
			{
				currentRole = (Role)role;
				anim.SetRoleAnimStates();
				anim.SetVoicePitch(pitch);
				WintryMonstrosities.DebugElf($"Elf {directorIndex} Role: {currentRole}");
			}
		}

		[PunRPC]
		public void SetupEyesRPC(Vector3 rotation, bool applyToLeftEye, PhotonMessageInfo info = default(PhotonMessageInfo))
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			if (!SemiFunc.MasterOnlyRPC(info))
			{
				return;
			}
			if (applyToLeftEye)
			{
				if (Random.Range(0, 10) == 0)
				{
					leftEye.SetActive(false);
					WintryMonstrosities.DebugElf("He lost his left eye!", this);
				}
				else
				{
					leftEye.transform.rotation = Quaternion.Euler(rotation);
					WintryMonstrosities.DebugElf($"Applied rotation offset to left eye {rotation}", this);
				}
			}
			else if (Random.Range(0, 10) == 0)
			{
				rightEye.SetActive(false);
				WintryMonstrosities.DebugElf("He lost his right eye!", this);
			}
			else
			{
				rightEye.transform.rotation = Quaternion.Euler(rotation);
				WintryMonstrosities.DebugElf($"Applied rotation offset to right eye {rotation}", this);
			}
		}
	}
	public class EnemyElfAlwaysActive : MonoBehaviour
	{
		public PropLight shootLight;

		private bool shootEffectActive;

		private float shootLightIntensity;

		private void Start()
		{
			shootLightIntensity = shootLight.lightComponent.intensity;
		}

		private void Update()
		{
			if (shootEffectActive)
			{
				Light lightComponent = shootLight.lightComponent;
				lightComponent.intensity -= Time.deltaTime * 20f;
				shootLight.originalIntensity = shootLightIntensity;
				if (!(shootLight.lightComponent.intensity > 0f))
				{
					((Behaviour)shootLight.lightComponent).enabled = false;
					shootEffectActive = false;
				}
			}
		}

		public void TriggerGunEffect()
		{
			shootEffectActive = true;
			((Behaviour)shootLight.lightComponent).enabled = true;
			shootLight.lightComponent.intensity = shootLightIntensity;
			shootLight.originalIntensity = shootLightIntensity;
		}
	}
	public class EnemyElfAnim : MonoBehaviour
	{
		public EnemyElf controller;

		internal readonly MaterialTrigger materialTrigger = new MaterialTrigger();

		private Animator anim;

		[Space]
		public GameObject[] decoratorObjects;

		public GameObject[] trumpeterObjects;

		public GameObject[] toymakerObjects;

		private readonly int boolIsDecorator = Animator.StringToHash("isDecorator");

		private readonly int boolIsTrumpeter = Animator.StringToHash("isTrumpeter");

		private readonly int boolIsToymaker = Animator.StringToHash("isToymaker");

		private readonly int boolDespawn = Animator.StringToHash("despawn");

		private readonly int boolMoving = Animator.StringToHash("moving");

		private readonly int boolFalling = Animator.StringToHash("falling");

		private readonly int boolStunned = Animator.StringToHash("stunned");

		private readonly int triggerSpawn = Animator.StringToHash("Spawn");

		private readonly int triggerJump = Animator.StringToHash("Jump");

		private readonly int triggerLand = Animator.StringToHash("Land");

		private readonly int triggerNotice = Animator.StringToHash("Notice");

		private readonly int triggerStun = Animator.StringToHash("Stun");

		private readonly int triggerDespawn = Animator.StringToHash("Despawn");

		private float moveTimer;

		private bool spawnImpulse = true;

		private bool jumpImpulse = true;

		private bool landImpulse = true;

		private bool noticeImpulse = true;

		private bool stunImpulse = true;

		private bool despawnImpulse = true;

		[Space]
		public ParticleSystem particleBits;

		public ParticleSystem particleDirectionalBits;

		public ParticleSystem particleImpact;

		public ParticleSystem particleSmoke;

		[Space]
		public GenericEyeLookAt eyeLookAt;

		[Space]
		public Transform voiceTransform;

		[Header("Generic Sounds")]
		public Sound soundSpawn;

		public Sound soundDespawn;

		[Space]
		public Sound soundFootstepLight;

		public Sound soundFootstepHeavy;

		public Sound soundMoveShort;

		public Sound soundMoveLong;

		[Space]
		public Sound soundJump;

		public Sound soundLand;

		[Space]
		public Sound soundNeckCrack;

		public Sound soundEyeTwitch;

		[Space]
		public Sound soundNotice;

		[Space]
		public Sound soundHurt;

		public Sound soundStunLoop;

		public Sound soundStunOutro;

		public Sound soundDeath;

		[Header("Trumpeter Sounds")]
		public Sound soundTrumpetAlert;

		public Sound soundTrumpetAlertGlobal;

		public Sound soundTrumpeterChaseLoop;

		public Sound soundTrumpeterGunShoot;

		public Sound soundTrumpeterGunShootGlobal;

		public void Awake()
		{
			anim = ((Component)this).GetComponent<Animator>();
			anim.keepAnimatorStateOnDisable = true;
		}

		private void Update()
		{
			AnimatorLogic();
			EyeLookAtLogic();
			SoundLoopLogic();
		}

		private void AnimatorLogic()
		{
			//IL_038a: Unknown result type (might be due to invalid IL or missing references)
			anim.speed = ((!controller.enemy.Rigidbody.frozen) ? 1 : 0);
			if (controller.currentState == EnemyElf.State.Spawn)
			{
				if (spawnImpulse)
				{
					anim.SetTrigger(triggerSpawn);
					spawnImpulse = false;
				}
			}
			else if (!spawnImpulse)
			{
				spawnImpulse = true;
			}
			bool flag;
			switch (controller.currentState)
			{
			case EnemyElf.State.Move:
			case EnemyElf.State.Investigate:
			case EnemyElf.State.Flee:
			case EnemyElf.State.WeaponPrepare:
			case EnemyElf.State.GunChase:
				flag = true;
				break;
			default:
				flag = false;
				break;
			}
			if (flag && (((Vector3)(ref controller.enemy.Rigidbody.velocity)).magnitude > 1f || ((Vector3)(ref controller.enemy.Rigidbody.physGrabObject.rbAngularVelocity)).magnitude > 1f))
			{
				moveTimer = 0.1f;
			}
			if (moveTimer > 0f)
			{
				moveTimer -= Time.deltaTime;
				anim.SetBool(boolMoving, true);
			}
			else
			{
				anim.SetBool(boolMoving, false);
			}
			if (controller.enemy.Jump.jumping || controller.enemy.Jump.jumpingDelay)
			{
				if (jumpImpulse)
				{
					if (!controller.enemy.IsStunned())
					{
						anim.SetTrigger(triggerJump);
						anim.SetBool(boolFalling, false);
					}
					jumpImpulse = false;
					landImpulse = true;
				}
				else if (controller.enemy.Rigidbody.physGrabObject.rbVelocity.y < -0.5f)
				{
					anim.SetBool(boolFalling, true);
				}
			}
			else
			{
				if (landImpulse)
				{
					if (!controller.enemy.IsStunned())
					{
						anim.SetTrigger(triggerLand);
					}
					moveTimer = 0f;
					landImpulse = false;
				}
				anim.SetBool(boolFalling, false);
				jumpImpulse = true;
			}
			if (controller.currentState == EnemyElf.State.Notice)
			{
				if (noticeImpulse)
				{
					anim.SetTrigger(triggerNotice);
					noticeImpulse = false;
				}
			}
			else if (!noticeImpulse)
			{
				noticeImpulse = true;
			}
			if (controller.currentState == EnemyElf.State.Stun)
			{
				if (stunImpulse)
				{
					anim.SetBool(boolStunned, true);
					anim.SetTrigger(triggerStun);
					stunImpulse = false;
				}
			}
			else if (!stunImpulse)
			{
				anim.SetBool(boolStunned, false);
				soundStunOutro.Play(voiceTransform.position, 1f, 1f, 1f, 1f);
				stunImpulse = true;
			}
			if (controller.currentState == EnemyElf.State.Despawn)
			{
				if (despawnImpulse)
				{
					anim.SetBool(boolDespawn, true);
					anim.SetTrigger(triggerDespawn);
					despawnImpulse = false;
					WintryMonstrosities.DebugElf("Anim despawn", controller);
				}
			}
			else if (!despawnImpulse)
			{
				anim.SetBool(boolDespawn, false);
				despawnImpulse = true;
				WintryMonstrosities.DebugElf("Respawned", controller);
			}
		}

		private void EyeLookAtLogic()
		{
			bool flag;
			switch (controller.currentState)
			{
			case EnemyElf.State.Notice:
			case EnemyElf.State.WeaponPrepare:
			case EnemyElf.State.WeaponDeploy:
			case EnemyElf.State.GunChase:
				flag = true;
				break;
			default:
				flag = false;
				break;
			}
			if (flag && Object.op_Implicit((Object)(object)controller.playerTarget) && !controller.playerTarget.isDisabled && !controller.IsVisionBlocked())
			{
				eyeLookAt.SetTargetPlayer(controller.playerTarget, 0.5f);
			}
		}

		private void SoundLoopLogic()
		{
			soundStunLoop.PlayLoop(controller.currentState == EnemyElf.State.Stun, 0.5f, 0.5f, 1f);
			soundTrumpeterChaseLoop.PlayLoop(controller.currentState == EnemyElf.State.GunChase, 0.5f, 0.5f, 1f);
		}

		public void EventSpawn()
		{
		}

		public void EventDespawn()
		{
			if (SemiFunc.IsMasterClientOrSingleplayer())
			{
				controller.enemy.EnemyParent.Despawn();
			}
		}

		public void EventTeleport()
		{
			//IL_0050: 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_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			if (controller.currentState == EnemyElf.State.Despawn)
			{
				soundDespawn.Play(((Component)this).transform.position, 1f, 1f, 1f, 1f);
			}
			else
			{
				soundSpawn.Play(((Component)this).transform.position, 1f, 1f, 1f, 1f);
			}
			GameDirector.instance.CameraShake.ShakeDistance(3f, 3f, 8f, controller.enemy.CenterTransform.position, 0.5f);
			GameDirector.instance.CameraImpact.ShakeDistance(3f, 3f, 8f, controller.enemy.CenterTransform.position, 0.5f);
			particleSmoke.Play();
		}

		public void EventFootstepLight()
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			if (controller.enemy.Grounded.grounded)
			{
				soundFootstepLight.Play(((Component)this).transform.position, 1f, 1f, 1f, 1f);
				MaterialImpulse((SoundType)0);
			}
		}

		public void EventFootstepHeavy()
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			if (controller.enemy.Grounded.grounded)
			{
				soundFootstepHeavy.Play(((Component)this).transform.position, 1f, 1f, 1f, 1f);
				MaterialImpulse((SoundType)1);
			}
		}

		public void EventMoveShort()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			soundMoveShort.Play(((Component)this).transform.position, 1f, 1f, 1f, 1f);
		}

		public void EventMoveLong()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			soundMoveLong.Play(((Component)this).transform.position, 1f, 1f, 1f, 1f);
		}

		public void EventJump()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			soundJump.Play(((Component)this).transform.position, 1f, 1f, 1f, 1f);
			MaterialImpulse((SoundType)1);
		}

		public void EventLand()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			soundLand.Play(((Component)this).transform.position, 1f, 1f, 1f, 1f);
			MaterialImpulse((SoundType)1);
		}

		public void EventNeckCrack()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			soundNeckCrack.Play(((Component)this).transform.position, 1f, 1f, 1f, 1f);
		}

		public void EventEyelidTwitch()
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			soundEyeTwitch.Play(((Component)voiceTransform).transform.position + new Vector3(0f, 0.2f, 0f), 1f, 1f, 1f, 1f);
		}

		public void EventNotice()
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			soundNotice.Play(((Component)voiceTransform).transform.position, 1f, 1f, 1f, 1f);
		}

		public void EventHurt()
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			soundHurt.Play(((Component)voiceTransform).transform.position, 1f, 1f, 1f, 1f);
		}

		public void EventDeath()
		{
			//IL_0012: 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_0073: Unknown result type (might be due to invalid IL or missing references)
			soundDeath.Play(((Component)voiceTransform).transform.position, 1f, 1f, 1f, 1f);
			particleImpact.Play();
			particleBits.Play();
			((Component)particleDirectionalBits).transform.rotation = Quaternion.LookRotation(-((Vector3)(ref controller.enemy.Health.hurtDirection)).normalized);
			particleDirectionalBits.Play();
			particleSmoke.Play();
		}

		public void EventTrumpetAlert()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			soundTrumpetAlert.Play(((Component)this).transform.position, 1f, 1f, 1f, 1f);
			soundTrumpetAlertGlobal.Play(((Component)this).transform.position, 1f, 1f, 1f, 1f);
		}

		public void EventGunShoot(Vector3 pos)
		{
			//IL_0007: 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)
			soundTrumpeterGunShoot.Play(pos, 1f, 1f, 1f, 1f);
			soundTrumpeterGunShootGlobal.Play(pos, 1f, 1f, 1f, 1f);
		}

		public void OnSpawn()
		{
			anim.SetTrigger(triggerSpawn);
			particleSmoke.Play();
		}

		public void SetRoleAnimStates()
		{
			switch (controller.currentRole)
			{
			case EnemyElf.Role.Decorator:
			{
				anim.SetBool(boolIsDecorator, true);
				GameObject[] array2 = decoratorObjects;
				foreach (GameObject val2 in array2)
				{
					val2.SetActive(true);
				}
				break;
			}
			case EnemyElf.Role.Trumpeter:
			{
				anim.SetBool(boolIsTrumpeter, true);
				GameObject[] array3 = trumpeterObjects;
				foreach (GameObject val3 in array3)
				{
					val3.SetActive(true);
				}
				break;
			}
			case EnemyElf.Role.Toymaker:
			{
				anim.SetBool(boolIsToymaker, true);
				GameObject[] array = toymakerObjects;
				foreach (GameObject val in array)
				{
					val.SetActive(true);
				}
				break;
			}
			}
			WintryMonstrosities.DebugElf($"Elf {controller.directorIndex}:\n" + $"-   -   -   -   -   -   -   - isDecorator anim state: {anim.GetBool(boolIsDecorator)}\n" + $"-   -   -   -   -   -   -   - isTrumpeter anim state: {anim.GetBool(boolIsTrumpeter)}\n" + $"-   -   -   -   -   -   -   - isToymaker anim state: {anim.GetBool(boolIsToymaker)}");
		}

		public void SetVoicePitch(float pitch)
		{
			soundNotice.Pitch = pitch;
			soundHurt.Pitch = pitch;
			soundDeath.Pitch = pitch;
		}

		public void MaterialImpulse(SoundType type, bool footstep = true)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			Materials.Instance.Impulse(controller.enemy.CenterTransform.position, Vector3.down, type, footstep, true, materialTrigger, (HostType)2);
		}
	}
	public class EnemyElfDirector : MonoBehaviour
	{
		public enum State
		{
			Idle,
			Leave,
			ChangeDestination,
			SplitUp,
			AllInvestigate
		}

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

			private object <>2__current;

			public EnemyElfDirector <>4__this;

			private List<EnemyParent>.Enumerator <>s__1;

			private EnemyParent <e>5__2;

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

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

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

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>s__1 = default(List<EnemyParent>.Enumerator);
				<e>5__2 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0029: Unknown result type (might be due to invalid IL or missing references)
				//IL_0033: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					break;
				case 1:
					<>1__state = -1;
					break;
				}
				if (!LevelGenerator.Instance.Generated)
				{
					<>2__current = (object)new WaitForSeconds(0.1f);
					<>1__state = 1;
					return true;
				}
				<>s__1 = EnemyDirector.instance.enemiesSpawned.GetEnumerator();
				try
				{
					while (<>s__1.MoveNext())
					{
						<e>5__2 = <>s__1.Current;
						EnemyElfDirector enemyElfDirector = <>4__this;
						EnemyParent obj = <e>5__2;
						enemyElfDirector.SetupSingle((obj != null) ? ((Component)obj.Enemy).GetComponent<EnemyElf>() : null);
						<e>5__2 = null;
					}
				}
				finally
				{
					((IDisposable)<>s__1).Dispose();
				}
				<>s__1 = default(List<EnemyParent>.Enumerator);
				<>4__this.setup = 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();
			}
		}

		internal static EnemyElfDirector instance;

		[Space]
		public List<EnemyElf> elves = new List<EnemyElf>();

		private int roleIndex = -1;

		internal readonly List<Vector3> destinations = new List<Vector3>();

		[Space]
		public State currentState = State.Idle;

		private bool stateImpulse;

		private float stateTimer;

		internal bool setup;

		internal Vector3 allInvestigatePosition;

		private void Awake()
		{
			if (!Object.op_Implicit((Object)(object)instance))
			{
				instance = this;
				((Component)this).transform.parent = LevelGenerator.Instance.EnemyParent.transform;
				((MonoBehaviour)this).StartCoroutine(Setup());
			}
			else
			{
				Object.Destroy((Object)(object)((Component)this).gameObject);
			}
		}

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

		internal void SetupSingle(EnemyElf elf)
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0259: Unknown result type (might be due to invalid IL or missing references)
			//IL_025f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0265: Unknown result type (might be due to invalid IL or missing references)
			//IL_023c: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)elf) || elves.Contains(elf))
			{
				return;
			}
			elves.Add(elf);
			destinations.Add(Vector3.zero);
			elf.directorIndex = elves.IndexOf(elf);
			if (!SemiFunc.IsMasterClientOrSingleplayer())
			{
				return;
			}
			WintryMonstrosities.DebugElf("- - - - - - - - - - - - - - - - - - - - - - - - -");
			if (roleIndex == -1)
			{
				roleIndex = Random.Range(0, Enum.GetValues(typeof(EnemyElf.Role)).Length);
				WintryMonstrosities.DebugElf($"Starting on roleIndex {roleIndex}: {(EnemyElf.Role)roleIndex}");
			}
			float num = Random.Range(0.9f, 1.1f);
			if (SemiFunc.IsMultiplayer())
			{
				elf.photonView.RPC("EnemySetupRPC", (RpcTarget)0, new object[2] { roleIndex, num });
			}
			else
			{
				elf.EnemySetupRPC(roleIndex, num);
			}
			roleIndex++;
			if (roleIndex >= Enum.GetValues(typeof(EnemyElf.Role)).Length)
			{
				roleIndex = 0;
			}
			if (Random.value < 0.3f)
			{
				WintryMonstrosities.DebugElf("Skipped eye setup", elf);
				return;
			}
			WintryMonstrosities.DebugElf("Setting up eyes", elf);
			int num2 = roleIndex;
			if (1 == 0)
			{
			}
			float num3 = num2 switch
			{
				0 => 8f, 
				1 => 4f, 
				2 => 12f, 
				_ => 8f, 
			};
			if (1 == 0)
			{
			}
			float num4 = num3;
			Vector3 val = default(Vector3);
			((Vector3)(ref val))..ctor(Random.Range(0f - num4, num4), Random.Range(0f - num4, num4), 0f);
			bool flag = Random.Range(0, 2) == 0;
			if (SemiFunc.IsMultiplayer())
			{
				elf.photonView.RPC("SetupEyesRPC", (RpcTarget)0, new object[2] { val, flag });
			}
			else
			{
				elf.SetupEyesRPC(val, flag);
			}
		}

		private void Update()
		{
			if (setup && SemiFunc.IsMasterClientOrSingleplayer())
			{
				switch (currentState)
				{
				case State.Idle:
					StateIdle();
					break;
				case State.Leave:
					StateLeave();
					break;
				case State.ChangeDestination:
					StateChangeDestination();
					break;
				case State.SplitUp:
					StateSplitUp();
					break;
				case State.AllInvestigate:
					StateAllInvestigate();
					break;
				}
			}
		}

		private void StateIdle()
		{
			if (SemiFunc.EnemySpawnIdlePause())
			{
				return;
			}
			if (stateImpulse)
			{
				stateImpulse = false;
				stateTimer = Random.Range(10f, 20f);
			}
			if (!SemiFunc.EnemySpawnIdlePause())
			{
				stateTimer -= Time.deltaTime;
				if (stateTimer <= 0f)
				{
					UpdateState((Random.value < 0.25f) ? State.SplitUp : State.ChangeDestination);
				}
				LeaveCheck();
			}
		}

		private void StateLeave()
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			if (stateImpulse)
			{
				bool flag = false;
				LevelPoint val = SemiFunc.LevelPointGetFurthestFromPlayer(((Component)this).transform.position, 5f);
				if (Object.op_Implicit((Object)(object)val))
				{
					flag = SetPosition(((Component)val).transform.position);
				}
				if (flag)
				{
					stateImpulse = false;
					UpdateState(State.Idle);
				}
			}
		}

		private void StateChangeDestination()
		{
			//IL_001b: 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_006e: Unknown result type (might be due to invalid IL or missing references)
			if (stateImpulse)
			{
				bool flag = false;
				LevelPoint val = SemiFunc.LevelPointGet(((Component)this).transform.position, 10f, 25f);
				if (!Object.op_Implicit((Object)(object)val))
				{
					val = SemiFunc.LevelPointGet(((Component)this).transform.position, 0f, 999f);
				}
				if (Object.op_Implicit((Object)(object)val))
				{
					flag = SetPosition(((Component)val).transform.position);
				}
				if (flag)
				{
					stateImpulse = false;
					UpdateState(State.Idle);
				}
			}
		}

		private void StateSplitUp()
		{
			if (stateImpulse)
			{
				stateImpulse = false;
				UpdateState(State.Idle);
			}
		}

		private void StateAllInvestigate()
		{
			if (stateImpulse)
			{
				stateImpulse = false;
				UpdateState(State.Idle);
			}
		}

		private void UpdateState(State state)
		{
			WintryMonstrosities.DebugElf($"Director: {currentState} to {state}");
			currentState = state;
			stateImpulse = true;
			stateTimer = 0f;
		}

		public void OnSpawn(EnemyElf elfSpawn)
		{
			bool flag = true;
			foreach (EnemyElf elf in elves)
			{
				if (Object.op_Implicit((Object)(object)elf))
				{
					if ((Object)(object)elfSpawn != (Object)(object)elf && elf.enemy.EnemyParent.Spawned)
					{
						flag = false;
					}
					elf.enemy.EnemyParent.DespawnedTimerSet(elf.enemy.EnemyParent.DespawnedTimer - 30f, false);
				}
			}
			if (flag)
			{
				UpdateState(State.ChangeDestination);
			}
		}

		public void Investigate(Vector3 position)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			if (currentState != State.AllInvestigate)
			{
				allInvestigatePosition = position;
				UpdateState(State.AllInvestigate);
				SetPosition(position);
			}
		}

		public void NotifyNearby(PlayerAvatar player, Vector3 position)
		{
			//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_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			List<EnemyElf> list = new List<EnemyElf>();
			foreach (EnemyElf elf in elves)
			{
				EnemyElf.State state = elf.currentState;
				bool flag = (uint)(state - 1) <= 3u;
				if (flag && !list.Contains(elf))
				{
					Vector3 val = ((Component)elf).transform.position - position;
					if (((Vector3)(ref val)).sqrMagnitude < 20.25f)
					{
						list.Add(elf);
					}
				}
			}
			foreach (EnemyElf item in list)
			{
				item.UpdatePlayerTarget(player);
				item.NoticeDelay();
			}
		}

		private bool SetPosition(Vector3 initialPos)
		{
			//IL_0001: 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_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_00c9: 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_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: 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_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0217: Unknown result type (might be due to invalid IL or missing references)
			//IL_0230: Unknown result type (might be due to invalid IL or missing references)
			//IL_0235: 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_024a: Unknown result type (might be due to invalid IL or missing references)
			//IL_010b: 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)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			//IL_0143: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: 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_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Unknown result type (might be due to invalid IL or missing references)
			//IL_017b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0180: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_0184: Unknown result type (might be due to invalid IL or missing references)
			//IL_018e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0193: Unknown result type (might be due to invalid IL or missing references)
			//IL_0198: Unknown result type (might be due to invalid IL or missing references)
			NavMeshHit val = default(NavMeshHit);
			if (!NavMesh.SamplePosition(initialPos, ref val, 10f, -1) || !Physics.Raycast(((NavMeshHit)(ref val)).position, Vector3.down, 10f, LayerMask.GetMask(new string[1] { "Default" })) || SemiFunc.EnemyPhysObjectSphereCheck(((NavMeshHit)(ref val)).position, 1f))
			{
				return false;
			}
			((Component)this).transform.position = ((NavMeshHit)(ref val)).position;
			((Component)this).transform.rotation = Quaternion.identity;
			float num = 360f / (float)elves.Count;
			NavMeshHit val3 = default(NavMeshHit);
			foreach (EnemyElf elf in elves)
			{
				float num2 = 0f;
				Vector3 value = ((Component)this).transform.position;
				Vector3 val2 = ((Component)this).transform.position;
				for (; num2 < 2f; num2 += 0.1f)
				{
					value = val2;
					val2 = ((NavMeshHit)(ref val)).position + ((Component)this).transform.forward * num2;
					if (!NavMesh.SamplePosition(val2, ref val3, 10f, 1) || !Physics.Raycast(val2, Vector3.down, 10f, LayerMask.GetMask(new string[1] { "Default" })))
					{
						break;
					}
					Vector3 val4 = val2 + Vector3.up * 0.5f - (((NavMeshHit)(ref val)).position + Vector3.up * 0.5f);
					Vector3 normalized = ((Vector3)(ref val4)).normalized;
					if (Physics.Raycast(val2 + Vector3.up * 0.5f, normalized, ((Vector3)(ref normalized)).magnitude, LayerMask.GetMask(new string[2] { "Default", "PhysGrabObjectHinge" })) || (num2 > 0.5f && Random.Range(0, 100) < 15))
					{
						break;
					}
				}
				destinations[elves.IndexOf(elf)] = value;
				Transform transform = ((Component)this).transform;
				Quaternion rotation = ((Component)this).transform.rotation;
				transform.rotation = Quaternion.Euler(0f, ((Quaternion)(ref rotation)).eulerAngles.y + num, 0f);
			}
			return true;
		}

		private void LeaveCheck()
		{
			bool flag = false;
			foreach (EnemyElf elf in elves)
			{
				if (Object.op_Implicit((Object)(object)elf) && SemiFunc.EnemyForceLeave(elf.enemy))
				{
					flag = true;
				}
			}
			if (flag)
			{
				UpdateState(State.Leave);
			}
		}

		public void PauseSpawnedTimers()
		{
			foreach (EnemyElf elf in elves)
			{
				if (elf != null)
				{
					elf.enemy.EnemyParent.SpawnedTimerPause(0.1f);
				}
			}
		}
	}
	public class ItemGrenadeOrnament : MonoBehaviour
	{
		private readonly int emissionColor = Shader.PropertyToID("_EmissionColor");

		private ItemEquippable itemEquippable;

		internal ItemToggle itemToggle;

		private PhotonView photonView;

		internal PhysGrabObject physGrabObject;

		private PhysGrabObjectImpactDetector physGrabObjectImpactDetector;

		[Space]
		public GameObject ornamentPrefabExplosion;

		private ParticlePrefabExplosion particlePrefabExplosion;

		public GameObject ornamentGrenadeEnable;

		public GameObject mesh;

		public Color blinkColor;

		private Material grenadeEmissionMaterial;

		public float tickTime = 3f;

		private float grenadeTimer;

		public Transform splinterTransform;

		public AnimationCurve splinterAnimationCurve;

		private float splinterAnimationProgress;

		public GameObject throwLine;

		private TrailRenderer throwLineTrail;

		private float throwLineTimer;

		[Space]
		public float explosionSize = 1.5f;

		public int playerDamage = 10;

		public int enemyDamage = 20;

		[Space]
		public Sound soundSplinter;

		public Sound soundTick;

		public Sound soundExplosion;

		public Sound soundExplosionGlobal;

		private bool detonated;

		private float nullCheckTimer;

		internal bool isActive;

		private Vector3 prevPosition;

		internal Rigidbody rb;

		private void Start()
		{
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			itemEquippable = ((Component)this).GetComponent<ItemEquippable>();
			itemToggle = ((Component)this).GetComponent<ItemToggle>();
			photonView = ((Component)this).GetComponent<PhotonView>();
			physGrabObject = ((Component)this).GetComponent<PhysGrabObject>();
			physGrabObjectImpactDetector = ((Component)this).GetComponent<PhysGrabObjectImpactDetector>();
			particlePrefabExplosion = ornamentPrefabExplosion.GetComponent<ParticlePrefabExplosion>();
			particlePrefabExplosion.explosionSize = explosionSize;
			particlePrefabExplosion.explosionDamage = playerDamage;
			particlePrefabExplosion.explosionDamageEnemy = enemyDamage;
			grenadeEmissionMaterial = mesh.GetComponent<Renderer>().material;
			throwLineTrail = throwLine.GetComponent<TrailRenderer>();
			rb = ((Component)this).GetComponent<Rigidbody>();
			prevPosition = rb.position;
		}

		private void FixedUpdate()
		{
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: 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_0074: 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_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: 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_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			if (detonated)
			{
				return;
			}
			if (itemEquippable.isEquipped || itemEquippable.wasEquippedTimer > 0f)
			{
				prevPosition = rb.position;
				return;
			}
			Vector3 val = (rb.position - prevPosition) / Time.fixedDeltaTime;
			Vector3 val2 = rb.position - prevPosition;
			_ = ((Vector3)(ref val2)).normalized;
			prevPosition = rb.position;
			if (!physGrabObject.grabbed && !physGrabObjectImpactDetector.inCart && ((Vector3)(ref val)).magnitude > 2f)
			{
				throwLineTimer = 0.2f;
			}
			if (throwLineTimer > 0f)
			{
				throwLineTrail.emitting = true;
				throwLineTimer -= Time.fixedDeltaTime;
			}
			else
			{
				throwLineTrail.emitting = false;
			}
		}

		private void Update()
		{
			//IL_0083: 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)
			//IL_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_011d: Unknown result type (might be due to invalid IL or missing references)
			soundTick.PlayLoop(isActive && !detonated, 1f, 1f, 1f);
			if (itemEquippable.isEquipped)
			{
				if (isActive)
				{
					isActive = false;
					grenadeTimer = 0f;
					splinterAnimationProgress = 0f;
					itemToggle.ToggleItem(false, -1);
					splinterTransform.localEulerAngles = Vector3.zero;
					grenadeEmissionMaterial.SetColor(emissionColor, Color.black);
				}
				return;
			}
			if (isActive && !detonated)
			{
				if (splinterAnimationProgress < 1f)
				{
					splinterAnimationProgress += 5f * Time.deltaTime;
					float num = splinterAnimationCurve.Evaluate(splinterAnimationProgress);
					splinterTransform.localEulerAngles = new Vector3(num * 90f, 0f, 0f);
				}
				float num2 = Mathf.PingPong(Time.time * 8f, 1f);
				Color val = blinkColor * Mathf.LinearToGammaSpace(num2);
				grenadeEmissionMaterial.SetColor(emissionColor, val);
			}
			if (detonated)
			{
				if (nullCheckTimer < 5f)
				{
					nullCheckTimer += Time.deltaTime;
					return;
				}
				if (!Object.op_Implicit((Object)(object)ornamentPrefabExplosion))
				{
					Object.Destroy((Object)(object)((Component)this).gameObject);
					WintryMonstrosities.DebugElf("Destroyed Ornament Grenade entirely");
				}
			}
			if (SemiFunc.IsMasterClientOrSingleplayer())
			{
				if (itemToggle.toggleState && !isActive)
				{
					isActive = true;
					TickStart();
				}
				if (!isActive)
				{
					grenadeTimer = 0f;
				}
				else if (grenadeTimer < tickTime)
				{
					grenadeTimer += Time.deltaTime;
				}
				else if (!detonated)
				{
					TickEnd();
				}
			}
		}

		private void TickStart()
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			if (SemiFunc.IsMasterClient())
			{
				photonView.RPC("TickStartRPC", (RpcTarget)0, Array.Empty<object>());
			}
			else
			{
				TickStartRPC();
			}
		}

		private void TickEnd()
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			if (SemiFunc.IsMasterClient())
			{
				photonView.RPC("TickEndRPC", (RpcTarget)0, Array.Empty<object>());
			}
			else
			{
				TickEndRPC();
			}
		}

		[PunRPC]
		private void TickStartRPC(PhotonMessageInfo info = default(PhotonMessageInfo))
		{
			//IL_0001: 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)
			if (SemiFunc.MasterOnlyRPC(info))
			{
				soundSplinter.Play(((Component)this).transform.position, 1f, 1f, 1f, 1f);
				isActive = true;
			}
		}

		[PunRPC]
		private void TickEndRPC(PhotonMessageInfo info = default(PhotonMessageInfo))
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			if (SemiFunc.MasterOnlyRPC(info) && !itemEquippable.isEquipped)
			{
				Explode();
			}
		}

		public void Explode()
		{
			//IL_00ae: 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)
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			foreach (PhysGrabber item in physGrabObject.playerGrabbing.ToList())
			{
				if (SemiFunc.IsMultiplayer())
				{
					item.photonView.RPC("ReleaseObjectRPC", (RpcTarget)0, new object[3] { false, 0.1f, photonView.ViewID });
				}
				else
				{
					item.ReleaseObject(photonView.ViewID, 0.1f);
				}
			}
			soundExplosion.Play(((Component)this).transform.position, 1f, 1f, 1f, 1f);
			soundExplosionGlobal.Play(((Component)this).transform.position, 1f, 1f, 1f, 1f);
			ornamentPrefabExplosion.SetActive(true);
			Object.Destroy((Object)(object)ornamentGrenadeEnable.gameObject);
			rb.velocity = Vector3.zero;
			rb.useGravity = false;
			detonated = true;
		}
	}
	[BepInPlugin("BLOKBUSTR.WintryMonstrosities", "WintryMonstrosities", "0.1.1")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class WintryMonstrosities : BaseUnityPlugin
	{
		private static ConfigEntry<bool> configEnableDebugElf;

		internal static WintryMonstrosities Instance { get; private set; }

		internal static ManualLogSource Logger => Instance._logger;

		private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger;

		internal Harmony? Harmony { get; set; }

		private void Awake()
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Expected O, but got Unknown
			configEnableDebugElf = ((BaseUnityPlugin)this).Config.Bind<bool>("Debug", "EnableDebugElf", true, new ConfigDescription("W