Decompiled source of BecomeTheMonster v1.1.0

BepInEx/plugins/BecomeTheMonster.dll

Decompiled 10 hours 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.Text;
using BecomeTheMonster.Movesets;
using BepInEx;
using BepInEx.Logging;
using ExitGames.Client.Photon;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using Photon.Realtime;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("BecomeTheMonster")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+882043fd2fa93ea0552cebab729507d08efef7c9")]
[assembly: AssemblyProduct("BecomeTheMonster")]
[assembly: AssemblyTitle("BecomeTheMonster")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace BecomeTheMonster
{
	[BepInPlugin("jordan.martin.becomethemonster", "Become The Monster", "1.1.0")]
	public class Plugin : BaseUnityPlugin
	{
		public const string PluginGuid = "jordan.martin.becomethemonster";

		public const string PluginName = "Become The Monster";

		public const string PluginVersion = "1.1.0";

		internal static ManualLogSource Log;

		private void Awake()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			Log = ((BaseUnityPlugin)this).Logger;
			new Harmony("jordan.martin.becomethemonster").PatchAll();
			Log.LogInfo((object)"Become The Monster v1.1.0 loaded.");
		}
	}
	internal static class GameFieldAccess
	{
		private static readonly FieldRef<PlayerAvatar, string> PlayerNameRef = AccessTools.FieldRefAccess<PlayerAvatar, string>("playerName");

		private static readonly FieldRef<PlayerAvatar, bool> IsLocalRef = AccessTools.FieldRefAccess<PlayerAvatar, bool>("isLocal");

		private static readonly FieldRef<PlayerAvatar, Vector3> RbVelocityRef = AccessTools.FieldRefAccess<PlayerAvatar, Vector3>("rbVelocity");

		private static readonly FieldRef<PlayerAvatar, PlayerTumble> TumbleRef = AccessTools.FieldRefAccess<PlayerAvatar, PlayerTumble>("tumble");

		private static readonly FieldRef<PlayerHealth, int> HealthRef = AccessTools.FieldRefAccess<PlayerHealth, int>("health");

		private static readonly FieldRef<PlayerHealth, int> MaxHealthRef = AccessTools.FieldRefAccess<PlayerHealth, int>("maxHealth");

		public static string GetPlayerName(PlayerAvatar avatar)
		{
			return PlayerNameRef.Invoke(avatar);
		}

		public static bool GetIsLocal(PlayerAvatar avatar)
		{
			return IsLocalRef.Invoke(avatar);
		}

		public static Vector3 GetRbVelocity(PlayerAvatar avatar)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			return RbVelocityRef.Invoke(avatar);
		}

		public static PlayerTumble GetTumble(PlayerAvatar avatar)
		{
			return TumbleRef.Invoke(avatar);
		}

		public static int GetHealth(PlayerHealth h)
		{
			return HealthRef.Invoke(h);
		}

		public static void SetHealth(PlayerHealth h, int value)
		{
			HealthRef.Invoke(h) = value;
		}

		public static int GetMaxHealth(PlayerHealth h)
		{
			return MaxHealthRef.Invoke(h);
		}

		public static void SetMaxHealth(PlayerHealth h, int value)
		{
			MaxHealthRef.Invoke(h) = value;
		}
	}
	[DefaultExecutionOrder(-100)]
	[RequireComponent(typeof(MonsterPossession))]
	public class MonsterAttackController : MonoBehaviour
	{
		private PlayerAvatar _avatar;

		private MonsterMoveset _moveset;

		private GameObject _hud;

		private MonsterMoveset _hudMoveset;

		private TextMeshProUGUI _formLabel;

		private Image _cooldownFill;

		private RectTransform _cooldownFillRect;

		private Image _cooldownBg;

		private Color _cooldownFillColor;

		private Color _cooldownBgColor;

		private TextMeshProUGUI _secondaryLabel;

		private Image _secondaryFill;

		private RectTransform _secondaryFillRect;

		private void Awake()
		{
			_avatar = ((Component)this).GetComponent<PlayerAvatar>();
			_moveset = ((Component)this).GetComponent<MonsterMoveset>();
		}

		private void BuildHud()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			//IL_006b: 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_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Expected O, but got Unknown
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: 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_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: 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_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Expected O, but got Unknown
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0153: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_0179: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0211: Unknown result type (might be due to invalid IL or missing references)
			//IL_0216: Unknown result type (might be due to invalid IL or missing references)
			//IL_021c: Unknown result type (might be due to invalid IL or missing references)
			//IL_021d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0227: Unknown result type (might be due to invalid IL or missing references)
			//IL_022d: Expected O, but got Unknown
			//IL_025d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0264: Unknown result type (might be due to invalid IL or missing references)
			//IL_0276: Unknown result type (might be due to invalid IL or missing references)
			//IL_028a: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f0: Unknown result type (might be due to invalid IL or missing references)
			_hud = new GameObject("BecomeTheMonster_AttackHud");
			Canvas obj = _hud.AddComponent<Canvas>();
			obj.renderMode = (RenderMode)0;
			obj.sortingOrder = 32766;
			_secondaryLabel = null;
			_secondaryFill = null;
			_secondaryFillRect = null;
			Color val = (Color)(((Object)(object)_moveset != (Object)null) ? _moveset.HudColor : new Color(0.9f, 0.1f, 0.1f));
			GameObject val2 = new GameObject("Crosshair");
			val2.transform.SetParent(_hud.transform, false);
			RectTransform obj2 = val2.AddComponent<RectTransform>();
			Vector2 val3 = default(Vector2);
			((Vector2)(ref val3))..ctor(0.5f, 0.5f);
			obj2.anchorMax = val3;
			obj2.anchorMin = val3;
			obj2.sizeDelta = new Vector2(36f, 36f);
			obj2.anchoredPosition = Vector2.zero;
			AddCrosshairBar(val2.transform, new Vector2(36f, 4f), val);
			AddCrosshairBar(val2.transform, new Vector2(4f, 36f), val);
			GameObject val4 = new GameObject("FormLabel");
			val4.transform.SetParent(_hud.transform, false);
			RectTransform obj3 = val4.AddComponent<RectTransform>();
			((Vector2)(ref val3))..ctor(0.5f, 0.5f);
			obj3.anchorMax = val3;
			obj3.anchorMin = val3;
			obj3.anchoredPosition = new Vector2(0f, 70f);
			obj3.sizeDelta = new Vector2(500f, 50f);
			_formLabel = val4.AddComponent<TextMeshProUGUI>();
			((TMP_Text)_formLabel).alignment = (TextAlignmentOptions)514;
			((TMP_Text)_formLabel).fontSize = 36f;
			((TMP_Text)_formLabel).fontStyle = (FontStyles)1;
			((Graphic)_formLabel).color = val;
			((TMP_Text)_formLabel).text = BuildActionLabel("LMB", ((Object)(object)_moveset != (Object)null) ? _moveset.AttackDisplayName : "Attack");
			_cooldownBgColor = new Color(0.08f, 0.08f, 0.08f, 0.85f);
			_cooldownFillColor = val;
			GameObject val5 = new GameObject("CooldownBarBg");
			val5.transform.SetParent(_hud.transform, false);
			RectTransform obj4 = val5.AddComponent<RectTransform>();
			((Vector2)(ref val3))..ctor(0.5f, 0.5f);
			obj4.anchorMax = val3;
			obj4.anchorMin = val3;
			obj4.anchoredPosition = new Vector2(0f, -70f);
			obj4.sizeDelta = new Vector2(260f, 28f);
			_cooldownBg = val5.AddComponent<Image>();
			((Graphic)_cooldownBg).color = _cooldownBgColor;
			_cooldownFillRect = CreateFillBar(val5.transform, "CooldownBarFill", _cooldownFillColor, out _cooldownFill);
			if ((Object)(object)_moveset != (Object)null && _moveset.HasSecondaryAction)
			{
				BuildSecondaryHud(val);
			}
		}

		private RectTransform CreateFillBar(Transform parent, string name, Color color, out Image image)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: 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_0065: 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)
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			RectTransform obj = val.AddComponent<RectTransform>();
			obj.anchorMin = new Vector2(0f, 0f);
			obj.anchorMax = new Vector2(0f, 1f);
			obj.pivot = new Vector2(0f, 0.5f);
			obj.anchoredPosition = Vector2.zero;
			obj.sizeDelta = Vector2.zero;
			image = val.AddComponent<Image>();
			((Graphic)image).color = color;
			return obj;
		}

		private static void SetFillFraction(RectTransform fillRect, float fraction)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)fillRect == (Object)null))
			{
				Vector2 anchorMax = fillRect.anchorMax;
				anchorMax.x = Mathf.Clamp01(fraction);
				fillRect.anchorMax = anchorMax;
			}
		}

		private static string BuildActionLabel(string control, string displayName)
		{
			return "[" + control + "] " + displayName;
		}

		private void BuildSecondaryHud(Color hudColor)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: 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_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Expected O, but got Unknown
			//IL_010f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: 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_013a: 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_0163: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("SecondaryLabel");
			val.transform.SetParent(_hud.transform, false);
			RectTransform obj = val.AddComponent<RectTransform>();
			Vector2 val2 = default(Vector2);
			((Vector2)(ref val2))..ctor(0.5f, 0.5f);
			obj.anchorMax = val2;
			obj.anchorMin = val2;
			obj.anchoredPosition = new Vector2(0f, -110f);
			obj.sizeDelta = new Vector2(260f, 26f);
			_secondaryLabel = val.AddComponent<TextMeshProUGUI>();
			((TMP_Text)_secondaryLabel).alignment = (TextAlignmentOptions)514;
			((TMP_Text)_secondaryLabel).fontSize = 16f;
			((TMP_Text)_secondaryLabel).fontStyle = (FontStyles)1;
			((Graphic)_secondaryLabel).color = hudColor;
			((TMP_Text)_secondaryLabel).text = BuildActionLabel("RMB", _moveset.SecondaryActionDisplayName);
			GameObject val3 = new GameObject("SecondaryBarBg");
			val3.transform.SetParent(_hud.transform, false);
			RectTransform obj2 = val3.AddComponent<RectTransform>();
			((Vector2)(ref val2))..ctor(0.5f, 0.5f);
			obj2.anchorMax = val2;
			obj2.anchorMin = val2;
			obj2.anchoredPosition = new Vector2(0f, -138f);
			obj2.sizeDelta = new Vector2(180f, 16f);
			((Graphic)val3.AddComponent<Image>()).color = _cooldownBgColor;
			_secondaryFillRect = CreateFillBar(val3.transform, "SecondaryBarFill", _cooldownFillColor, out _secondaryFill);
		}

		private void AddCrosshairBar(Transform parent, Vector2 size, Color color)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("Bar");
			val.transform.SetParent(parent, false);
			RectTransform obj = val.AddComponent<RectTransform>();
			Vector2 val2 = default(Vector2);
			((Vector2)(ref val2))..ctor(0.5f, 0.5f);
			obj.anchorMax = val2;
			obj.anchorMin = val2;
			obj.sizeDelta = size;
			obj.anchoredPosition = Vector2.zero;
			((Graphic)val.AddComponent<Image>()).color = color;
		}

		private void Update()
		{
			if ((Object)(object)_avatar == (Object)null || !GameFieldAccess.GetIsLocal(_avatar))
			{
				return;
			}
			if ((Object)(object)_moveset == (Object)null)
			{
				_moveset = ((Component)this).GetComponent<MonsterMoveset>();
			}
			if ((Object)(object)_moveset == (Object)null)
			{
				return;
			}
			if ((Object)(object)_hud == (Object)null || (Object)(object)_hudMoveset != (Object)(object)_moveset)
			{
				if ((Object)(object)_hud != (Object)null)
				{
					Object.Destroy((Object)(object)_hud);
				}
				BuildHud();
				_hudMoveset = _moveset;
			}
			_moveset.TickInput();
			SetFillFraction(_cooldownFillRect, _moveset.CooldownFraction);
			SetFillFraction(_secondaryFillRect, _moveset.SecondaryCooldownFraction);
		}

		private void OnDestroy()
		{
			if ((Object)(object)_hud != (Object)null)
			{
				Object.Destroy((Object)(object)_hud);
			}
		}
	}
	public static class MonsterDeathOrbEffect
	{
		private const float Duration = 0.8f;

		public static void Spawn(Vector3 position)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			//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_0017: 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_0081: 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_00a6: 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)
			GameObject val = new GameObject("BecomeTheMonster_DeathOrb");
			val.transform.position = position + Vector3.up;
			Light val2 = val.AddComponent<Light>();
			val2.type = (LightType)2;
			Color val3 = default(Color);
			((Color)(ref val3))..ctor(0.65f, 0.85f, 1f);
			val2.color = val3;
			val2.range = 8f;
			val2.intensity = 6f;
			GameObject val4 = GameObject.CreatePrimitive((PrimitiveType)0);
			val4.transform.SetParent(val.transform, false);
			val4.transform.localScale = Vector3.one * 0.2f;
			Object.Destroy((Object)(object)val4.GetComponent<Collider>());
			Material material = (val4.GetComponent<Renderer>().material = VfxMaterial.CreateUnlit(val3));
			val.AddComponent<MonsterDeathOrbBehaviour>().Init(val2, val4.transform, material, val3, 0.8f);
		}
	}
	internal class MonsterDeathOrbBehaviour : MonoBehaviour
	{
		private Light _light;

		private Transform _sphere;

		private Material _material;

		private Color _baseColor;

		private float _duration;

		private float _timer;

		private float _initialIntensity;

		private Vector3 _initialScale;

		public void Init(Light light, Transform sphere, Material material, Color baseColor, float duration)
		{
			//IL_0016: 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_0033: 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)
			_light = light;
			_sphere = sphere;
			_material = material;
			_baseColor = baseColor;
			_duration = duration;
			_initialIntensity = light.intensity;
			_initialScale = sphere.localScale;
		}

		private void Update()
		{
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: 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_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			_timer += Time.deltaTime;
			float num = Mathf.Clamp01(_timer / _duration);
			_light.intensity = Mathf.Lerp(_initialIntensity, 0f, num);
			_sphere.localScale = Vector3.Lerp(_initialScale, _initialScale * 5f, num);
			if ((Object)(object)_material != (Object)null)
			{
				_material.color = Color.Lerp(_baseColor, Color.black, num);
			}
			if (num >= 1f)
			{
				Object.Destroy((Object)(object)((Component)this).gameObject);
			}
		}
	}
	public class MonsterDirector : MonoBehaviourPunCallbacks, IOnEventCallback
	{
		public const byte MonsterSelectionEventCode = 199;

		public static MonsterDirector instance;

		public MonsterFormPool formPool;

		public static readonly bool ForceLocalPlayerAsMonster = Environment.GetEnvironmentVariable("BECOMETHEMONSTER_FORCE_LOCAL") == "1";

		private void Awake()
		{
			instance = this;
			Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
			MonsterRevealUI.EnsureInstance();
			if ((Object)(object)formPool == (Object)null)
			{
				Debug.LogWarning((object)"[BecomeTheMonster] No MonsterFormPool assigned to MonsterDirector — using default pool with unassigned prefabs. Assign real Enemy prefabs in the Inspector (see README).");
				formPool = MonsterFormPool.CreateDefault();
			}
		}

		public override void OnEnable()
		{
			((MonoBehaviourPunCallbacks)this).OnEnable();
			PhotonNetwork.AddCallbackTarget((object)this);
		}

		public override void OnDisable()
		{
			((MonoBehaviourPunCallbacks)this).OnDisable();
			PhotonNetwork.RemoveCallbackTarget((object)this);
		}

		public void SelectAndAssignMonsters()
		{
			((MonoBehaviour)this).StartCoroutine(SelectAndAssignMonstersRoutine());
		}

		private IEnumerator SelectAndAssignMonstersRoutine()
		{
			yield return (object)new WaitForSeconds(1.5f);
			DoSelectAndAssignMonsters();
		}

		private void DoSelectAndAssignMonsters()
		{
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Expected O, but got Unknown
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_018a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0195: Unknown result type (might be due to invalid IL or missing references)
			if (!SemiFunc.IsMasterClientOrSingleplayer() || (!SemiFunc.RunIsLevel() && !SemiFunc.RunIsTutorial()))
			{
				return;
			}
			List<PlayerAvatar> list = SemiFunc.PlayerGetList();
			if (list == null || list.Count == 0)
			{
				return;
			}
			int num = Mathf.Max(1, list.Count / 5);
			num = Mathf.Min(num, list.Count);
			List<PlayerAvatar> list2 = list.OrderBy((PlayerAvatar _) => Random.value).ToList().Take(num)
				.ToList();
			if (ForceLocalPlayerAsMonster)
			{
				PlayerAvatar val = ((IEnumerable<PlayerAvatar>)list).FirstOrDefault((Func<PlayerAvatar, bool>)GameFieldAccess.GetIsLocal);
				if ((Object)(object)val != (Object)null && !list2.Contains(val))
				{
					list2.Insert(0, val);
					if (list2.Count > num)
					{
						list2.RemoveAt(list2.Count - 1);
					}
				}
			}
			string[] array = new string[list2.Count];
			for (int num2 = 0; num2 < list2.Count; num2++)
			{
				MonsterFormEntry nextForm = formPool.GetNextForm();
				array[num2] = ((nextForm != null) ? nextForm.displayName : string.Empty);
			}
			if (!PhotonNetwork.InRoom)
			{
				ApplySelectionDirect(list2, array);
				return;
			}
			int[] array2 = list2.Select((PlayerAvatar p) => p.photonView.ViewID).ToArray();
			object[] array3 = new object[2] { array2, array };
			RaiseEventOptions val2 = new RaiseEventOptions
			{
				Receivers = (ReceiverGroup)1
			};
			SendOptions val3 = default(SendOptions);
			((SendOptions)(ref val3)).Reliability = true;
			SendOptions val4 = val3;
			PhotonNetwork.RaiseEvent((byte)199, (object)array3, val2, val4);
		}

		public void RespawnAsNewForm(PlayerAvatar avatar)
		{
			//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_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Expected O, but got Unknown
			//IL_0086: 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_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			if (SemiFunc.IsMasterClientOrSingleplayer())
			{
				MonsterFormEntry nextForm = formPool.GetNextForm();
				string text = ((nextForm != null) ? nextForm.displayName : string.Empty);
				if (!PhotonNetwork.InRoom)
				{
					ApplySelectionDirect(new List<PlayerAvatar> { avatar }, new string[1] { text });
					return;
				}
				int[] array = new int[1] { avatar.photonView.ViewID };
				object[] array2 = new object[2]
				{
					array,
					new string[1] { text }
				};
				RaiseEventOptions val = new RaiseEventOptions
				{
					Receivers = (ReceiverGroup)1
				};
				SendOptions val2 = default(SendOptions);
				((SendOptions)(ref val2)).Reliability = true;
				SendOptions val3 = val2;
				PhotonNetwork.RaiseEvent((byte)199, (object)array2, val, val3);
			}
		}

		public void OnEvent(EventData photonEvent)
		{
			if (photonEvent.Code == 199)
			{
				object[] obj = (object[])photonEvent.CustomData;
				int[] viewIds = (int[])obj[0];
				string[] formNames = (string[])obj[1];
				ApplySelection(viewIds, formNames);
			}
		}

		private void ApplySelection(int[] viewIds, string[] formNames)
		{
			List<PlayerAvatar> list = new List<PlayerAvatar>(viewIds.Length);
			foreach (int num in viewIds)
			{
				PhotonView val = PhotonView.Find(num);
				if ((Object)(object)val == (Object)null)
				{
					Debug.LogWarning((object)$"[BecomeTheMonster] Could not resolve PhotonView {num} for monster selection.");
					continue;
				}
				PlayerAvatar component = ((Component)val).GetComponent<PlayerAvatar>();
				if ((Object)(object)component != (Object)null)
				{
					list.Add(component);
				}
			}
			ApplySelectionDirect(list, formNames);
		}

		private void ApplySelectionDirect(List<PlayerAvatar> avatars, string[] formNames)
		{
			List<(string, string)> list = new List<(string, string)>();
			bool localIsMonster = false;
			string localFormName = null;
			for (int i = 0; i < avatars.Count; i++)
			{
				PlayerAvatar val = avatars[i];
				if (!((Object)(object)val == (Object)null))
				{
					MonsterFormEntry formByName = formPool.GetFormByName(formNames[i]);
					MonsterPossession component = ((Component)val).GetComponent<MonsterPossession>();
					if ((Object)(object)component != (Object)null)
					{
						component.RespawnAs(formByName);
					}
					else
					{
						component = ((Component)val).gameObject.AddComponent<MonsterPossession>();
						component.Apply(val, formByName);
					}
					list.Add((GameFieldAccess.GetPlayerName(val), formNames[i]));
					if (GameFieldAccess.GetIsLocal(val))
					{
						localIsMonster = true;
						localFormName = formNames[i];
					}
				}
			}
			if (list.Count > 0 && (Object)(object)MonsterRevealUI.instance != (Object)null)
			{
				MonsterRevealUI.instance.Show(list, localIsMonster, localFormName);
			}
		}
	}
	[Serializable]
	public class MonsterFormEntry
	{
		public string displayName;

		public GameObject enemyPrefab;
	}
	[CreateAssetMenu(fileName = "MonsterFormPool", menuName = "Become The Monster/Monster Form Pool")]
	public class MonsterFormPool : ScriptableObject
	{
		public MonsterFormEntry[] forms = Array.Empty<MonsterFormEntry>();

		private int _sequentialIndex = -1;

		private static readonly (string displayName, string resourceFileName)[] DefaultForms = new(string, string)[12]
		{
			("Gnome", "Enemy - Gnome"),
			("Bang", "Enemy - Bang"),
			("Runner", "Enemy - Runner"),
			("Duck", "Enemy - Duck"),
			("Bowtie", "Enemy - Bowtie"),
			("Robe", "Enemy - Robe"),
			("Beamer", "Enemy - Beamer"),
			("Floater", "Enemy - Floater"),
			("Spinny", "Enemy - Spinny"),
			("Slow Walker", "Enemy - Slow Walker"),
			("Birthday Boy", "Enemy - Birthday boy"),
			("Hidden", "Enemy - Hidden")
		};

		public MonsterFormEntry GetRandomForm(string excludeDisplayName = null)
		{
			if (forms == null || forms.Length == 0)
			{
				Debug.LogError((object)"[BecomeTheMonster] MonsterFormPool has no forms configured.");
				return null;
			}
			if (forms.Length == 1 || excludeDisplayName == null)
			{
				return forms[Random.Range(0, forms.Length)];
			}
			List<MonsterFormEntry> list = new List<MonsterFormEntry>(forms.Length - 1);
			MonsterFormEntry[] array = forms;
			foreach (MonsterFormEntry monsterFormEntry in array)
			{
				if (monsterFormEntry.displayName != excludeDisplayName)
				{
					list.Add(monsterFormEntry);
				}
			}
			if (list.Count == 0)
			{
				return forms[Random.Range(0, forms.Length)];
			}
			return list[Random.Range(0, list.Count)];
		}

		public MonsterFormEntry GetNextForm()
		{
			if (forms == null || forms.Length == 0)
			{
				Debug.LogError((object)"[BecomeTheMonster] MonsterFormPool has no forms configured.");
				return null;
			}
			_sequentialIndex = (_sequentialIndex + 1) % forms.Length;
			return forms[_sequentialIndex];
		}

		public MonsterFormEntry GetFormByName(string name)
		{
			if (forms == null)
			{
				return null;
			}
			MonsterFormEntry[] array = forms;
			foreach (MonsterFormEntry monsterFormEntry in array)
			{
				if (monsterFormEntry.displayName == name)
				{
					return monsterFormEntry;
				}
			}
			return null;
		}

		public static MonsterFormPool CreateDefault()
		{
			MonsterFormPool monsterFormPool = ScriptableObject.CreateInstance<MonsterFormPool>();
			List<MonsterFormEntry> list = new List<MonsterFormEntry>(DefaultForms.Length);
			(string, string)[] defaultForms = DefaultForms;
			for (int i = 0; i < defaultForms.Length; i++)
			{
				(string, string) tuple = defaultForms[i];
				string item = tuple.Item1;
				string item2 = tuple.Item2;
				GameObject val = Resources.Load<GameObject>("enemies/" + item2);
				if ((Object)(object)val == (Object)null)
				{
					Debug.LogWarning((object)("[BecomeTheMonster] Could not load enemy prefab \"enemies/" + item2 + "\" for form \"" + item + "\" — skipping."));
				}
				else
				{
					list.Add(new MonsterFormEntry
					{
						displayName = item,
						enemyPrefab = val
					});
				}
			}
			monsterFormPool.forms = list.ToArray();
			return monsterFormPool;
		}
	}
	public class MonsterPossession : MonoBehaviour
	{
		public PlayerAvatar avatar;

		public string formName;

		public GameObject enemyPrefab;

		public Animator monsterAnimator;

		public MonsterMoveset moveset;

		private GameObject _monsterVisual;

		private readonly List<Renderer> _bodyRenderers = new List<Renderer>();

		private readonly List<string> _movementFloatParams = new List<string>();

		private readonly List<string> _movementBoolParams = new List<string>();

		private float _normalCameraHeight;

		private Vector3 _originalCameraPlayerOffset;

		private bool _cameraPlayerOffsetCaptured;

		private bool _cameraOffsetReady;

		private float _originalJumpForce;

		private bool _jumpForceCaptured;

		private float _originalSprintSpeed;

		private bool _sprintSpeedCaptured;

		private bool _originalDebugEnergy;

		private bool _debugEnergyCaptured;

		private int _originalMaxHealth;

		private bool _healthApplied;

		public GameObject MonsterVisual => _monsterVisual;

		public void Apply(PlayerAvatar targetAvatar, MonsterFormEntry form)
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_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)
			avatar = targetAvatar;
			_normalCameraHeight = 1.6f;
			if ((Object)(object)avatar.localCamera != (Object)null)
			{
				_normalCameraHeight = ((Component)avatar.localCamera).transform.position.y - ((Component)avatar).transform.position.y;
			}
			if ((Object)(object)CameraPosition.instance != (Object)null)
			{
				_originalCameraPlayerOffset = CameraPosition.instance.playerOffset;
			}
			_cameraPlayerOffsetCaptured = true;
			SetPlayerVisualsVisible(visible: false);
			SetFlashlightActive(active: false);
			SetInventoryHudVisible(visible: false);
			SetEnergyHudVisible(visible: false);
			ApplyForm(form);
			((Component)this).gameObject.AddComponent<MonsterAttackController>();
		}

		public void OnMonsterDeath()
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			MonsterDeathOrbEffect.Spawn(((Component)avatar).transform.position);
			if ((Object)(object)MonsterDirector.instance != (Object)null)
			{
				MonsterDirector.instance.RespawnAsNewForm(avatar);
			}
		}

		public void RespawnAs(MonsterFormEntry form)
		{
			if ((Object)(object)_monsterVisual != (Object)null)
			{
				Object.Destroy((Object)(object)_monsterVisual);
			}
			if ((Object)(object)moveset != (Object)null)
			{
				Object.Destroy((Object)(object)moveset);
			}
			monsterAnimator = null;
			moveset = null;
			_bodyRenderers.Clear();
			_movementFloatParams.Clear();
			_movementBoolParams.Clear();
			_cameraOffsetReady = false;
			ApplyForm(form);
		}

		private void ApplyForm(MonsterFormEntry form)
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: 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_0067: Unknown result type (might be due to invalid IL or missing references)
			formName = ((form != null) ? form.displayName : "Monster");
			enemyPrefab = form?.enemyPrefab;
			if (form != null && (Object)(object)form.enemyPrefab != (Object)null)
			{
				SpawnMonsterVisual(form.enemyPrefab);
			}
			Vector3 randomNonTruckPosition = GetRandomNonTruckPosition(((Component)avatar).transform.position);
			avatar.Spawn(randomNonTruckPosition, Quaternion.identity);
		}

		private void SetFlashlightActive(bool active)
		{
			if (!((Object)(object)avatar.flashlightController == (Object)null))
			{
				((Component)avatar.flashlightController).gameObject.SetActive(active);
			}
		}

		private void SetInventoryHudVisible(bool visible)
		{
			if (GameFieldAccess.GetIsLocal(avatar) && !((Object)(object)InventoryUI.instance == (Object)null))
			{
				if (visible)
				{
					((SemiUI)InventoryUI.instance).Show();
				}
				else
				{
					((SemiUI)InventoryUI.instance).Hide();
				}
			}
		}

		private void SetEnergyHudVisible(bool visible)
		{
			if (GameFieldAccess.GetIsLocal(avatar) && !((Object)(object)EnergyUI.instance == (Object)null))
			{
				if (visible)
				{
					((SemiUI)EnergyUI.instance).Show();
				}
				else
				{
					((SemiUI)EnergyUI.instance).Hide();
				}
			}
		}

		private void SetPlayerVisualsVisible(bool visible)
		{
			PlayerAvatarVisuals component = ((Component)avatar).GetComponent<PlayerAvatarVisuals>();
			if (!((Object)(object)component == (Object)null))
			{
				Renderer[] componentsInChildren = ((Component)component).GetComponentsInChildren<Renderer>(true);
				for (int i = 0; i < componentsInChildren.Length; i++)
				{
					componentsInChildren[i].enabled = visible;
				}
			}
		}

		private void SpawnMonsterVisual(GameObject enemyPrefab)
		{
			//IL_003e: 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)
			_monsterVisual = Object.Instantiate<GameObject>(enemyPrefab, ((Component)avatar).transform);
			_monsterVisual.transform.SetParent(((Component)avatar).transform, false);
			_monsterVisual.transform.localPosition = Vector3.zero;
			_monsterVisual.transform.localRotation = Quaternion.identity;
			((MonoBehaviour)this).StartCoroutine(StripAiAfterOwnSetup());
		}

		private IEnumerator StripAiAfterOwnSetup()
		{
			yield return null;
			if ((Object)(object)_monsterVisual == (Object)null)
			{
				yield break;
			}
			Behaviour[] componentsInChildren = _monsterVisual.GetComponentsInChildren<Behaviour>(true);
			foreach (Behaviour val in componentsInChildren)
			{
				if (!(val is Animator))
				{
					val.enabled = false;
				}
			}
			Renderer[] componentsInChildren2 = _monsterVisual.GetComponentsInChildren<Renderer>(true);
			for (int i = 0; i < componentsInChildren2.Length; i++)
			{
				componentsInChildren2[i].enabled = true;
			}
			Collider[] componentsInChildren3 = _monsterVisual.GetComponentsInChildren<Collider>(true);
			for (int i = 0; i < componentsInChildren3.Length; i++)
			{
				componentsInChildren3[i].enabled = false;
			}
			Rigidbody[] componentsInChildren4 = _monsterVisual.GetComponentsInChildren<Rigidbody>(true);
			foreach (Rigidbody val2 in componentsInChildren4)
			{
				if (!val2.isKinematic)
				{
					val2.velocity = Vector3.zero;
					val2.angularVelocity = Vector3.zero;
					val2.isKinematic = true;
				}
			}
			monsterAnimator = _monsterVisual.GetComponentInChildren<Animator>();
			CacheMovementAnimatorParams();
			if ((Object)(object)monsterAnimator != (Object)null)
			{
				monsterAnimator.applyRootMotion = false;
			}
			Type movesetType = MonsterMovesetRegistry.GetMovesetType(formName);
			moveset = (MonsterMoveset)(object)((Component)this).gameObject.AddComponent(movesetType);
			moveset.Init(avatar, monsterAnimator, this);
			CacheBodyRenderers();
			ApplyMonsterHealth();
		}

		private void ApplyMonsterHealth()
		{
			if (!((Object)(object)avatar.playerHealth == (Object)null) && !((Object)(object)moveset == (Object)null))
			{
				if (!_healthApplied)
				{
					_originalMaxHealth = GameFieldAccess.GetMaxHealth(avatar.playerHealth);
					_healthApplied = true;
				}
				int monsterMaxHealth = moveset.MonsterMaxHealth;
				GameFieldAccess.SetMaxHealth(avatar.playerHealth, monsterMaxHealth);
				GameFieldAccess.SetHealth(avatar.playerHealth, monsterMaxHealth);
			}
		}

		private void CacheBodyRenderers()
		{
			_bodyRenderers.Clear();
			Renderer[] componentsInChildren = _monsterVisual.GetComponentsInChildren<Renderer>(true);
			foreach (Renderer val in componentsInChildren)
			{
				SkinnedMeshRenderer val2 = (SkinnedMeshRenderer)(object)((val is SkinnedMeshRenderer) ? val : null);
				if (val2 != null)
				{
					val2.updateWhenOffscreen = true;
					_bodyRenderers.Add(val);
				}
				else if (val is MeshRenderer)
				{
					_bodyRenderers.Add(val);
				}
			}
			_cameraOffsetReady = true;
		}

		private void CacheMovementAnimatorParams()
		{
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Invalid comparison between Unknown and I4
			_movementFloatParams.Clear();
			_movementBoolParams.Clear();
			if ((Object)(object)monsterAnimator == (Object)null)
			{
				return;
			}
			AnimatorControllerParameter[] parameters = monsterAnimator.parameters;
			foreach (AnimatorControllerParameter val in parameters)
			{
				string text = val.name.ToLowerInvariant();
				if ((int)val.type == 1)
				{
					switch (text)
					{
					case "speed":
					case "movespeed":
					case "velocity":
						_movementFloatParams.Add(val.name);
						continue;
					}
				}
				if ((int)val.type == 4)
				{
					switch (text)
					{
					case "moving":
					case "ismoving":
					case "walking":
						_movementBoolParams.Add(val.name);
						break;
					}
				}
			}
		}

		private void Update()
		{
			//IL_0061: 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_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			SetPlayerVisualsVisible(visible: false);
			if ((Object)(object)_monsterVisual != (Object)null)
			{
				if ((Object)(object)_monsterVisual.transform.parent != (Object)(object)((Component)avatar).transform)
				{
					_monsterVisual.transform.SetParent(((Component)avatar).transform, false);
					_monsterVisual.transform.localPosition = Vector3.zero;
					_monsterVisual.transform.localRotation = Quaternion.identity;
				}
				Renderer[] componentsInChildren = _monsterVisual.GetComponentsInChildren<Renderer>(true);
				for (int i = 0; i < componentsInChildren.Length; i++)
				{
					componentsInChildren[i].enabled = true;
				}
			}
			if ((Object)(object)monsterAnimator != (Object)null && (Object)(object)avatar != (Object)null)
			{
				Vector3 rbVelocity = GameFieldAccess.GetRbVelocity(avatar);
				float magnitude = ((Vector3)(ref rbVelocity)).magnitude;
				bool flag = (Object)(object)moveset != (Object)null && moveset.SuppressMovingAnimation;
				bool flag2 = magnitude > 0.15f && !flag;
				foreach (string movementFloatParam in _movementFloatParams)
				{
					monsterAnimator.SetFloat(movementFloatParam, magnitude);
				}
				foreach (string movementBoolParam in _movementBoolParams)
				{
					monsterAnimator.SetBool(movementBoolParam, flag2);
				}
			}
			if ((Object)(object)avatar != (Object)null && GameFieldAccess.GetIsLocal(avatar) && (Object)(object)PlayerController.instance != (Object)null)
			{
				if (!_jumpForceCaptured)
				{
					_originalJumpForce = PlayerController.instance.JumpForce;
					_jumpForceCaptured = true;
				}
				bool flag3 = (Object)(object)moveset != (Object)null && moveset.AllowJump;
				bool num = (Object)(object)moveset != (Object)null && moveset.AllowCrouch;
				float num2 = (((Object)(object)moveset != (Object)null) ? moveset.MoveSpeedMultiplier : 1f);
				PlayerController.instance.JumpForce = (flag3 ? _originalJumpForce : 0f);
				if (!num)
				{
					PlayerController.instance.CrouchDisable(0.5f);
				}
				if (!Mathf.Approximately(num2, 1f))
				{
					PlayerController.instance.MoveMult(num2, 0.5f);
				}
				if (!_sprintSpeedCaptured)
				{
					_originalSprintSpeed = PlayerController.instance.SprintSpeed;
					_sprintSpeedCaptured = true;
				}
				PlayerController.instance.SprintSpeed = PlayerController.instance.MoveSpeed;
				if (!_debugEnergyCaptured)
				{
					_originalDebugEnergy = PlayerController.instance.DebugEnergy;
					_debugEnergyCaptured = true;
				}
				PlayerController.instance.DebugEnergy = true;
				if ((Object)(object)PhysGrabber.instance != (Object)null)
				{
					PhysGrabber.instance.OverrideGrabDisable(0.5f);
				}
			}
		}

		private void LateUpdate()
		{
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: 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_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0198: Unknown result type (might be due to invalid IL or missing references)
			//IL_0152: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Unknown result type (might be due to invalid IL or missing references)
			//IL_016c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_0183: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: 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_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: 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)
			if (!_cameraOffsetReady || (Object)(object)avatar == (Object)null || !GameFieldAccess.GetIsLocal(avatar) || (Object)(object)avatar.localCamera == (Object)null)
			{
				return;
			}
			float num = 1.6f;
			float num2 = 10f;
			if (_bodyRenderers.Count > 0)
			{
				Bounds bounds = _bodyRenderers[0].bounds;
				foreach (Renderer bodyRenderer in _bodyRenderers)
				{
					((Bounds)(ref bounds)).Encapsulate(bodyRenderer.bounds);
				}
				num = Mathf.Max(0.5f, ((Bounds)(ref bounds)).max.y - ((Component)avatar).transform.position.y);
				Vector2 val = new Vector2(((Bounds)(ref bounds)).extents.x, ((Bounds)(ref bounds)).extents.z);
				num2 = Mathf.Max(12f, ((Vector2)(ref val)).magnitude + 11f);
			}
			Vector3 position = ((Component)avatar).transform.position;
			position.y += num;
			position -= ((Component)avatar).transform.forward * num2;
			if ((Object)(object)CameraPosition.instance != (Object)null)
			{
				Vector3 originalCameraPlayerOffset = _originalCameraPlayerOffset;
				originalCameraPlayerOffset.y = position.y - ((Component)avatar).transform.position.y;
				CameraPosition.instance.playerOffset = originalCameraPlayerOffset;
			}
			((Component)avatar.localCamera).transform.position = position;
		}

		public static Vector3 GetRandomNonTruckPosition(Vector3? avoidNear = null)
		{
			//IL_0041: 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_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			List<LevelPoint> list = (from p in SemiFunc.LevelPointsGetAll()
				where !p.Truck
				select p).ToList();
			if (list.Count == 0)
			{
				Debug.LogWarning((object)"[BecomeTheMonster] No non-truck level points found, falling back to origin.");
				return Vector3.zero;
			}
			if (avoidNear.HasValue && list.Count > 1)
			{
				LevelPoint val = list[0];
				float num = Vector3.Distance(((Component)val).transform.position, avoidNear.Value);
				foreach (LevelPoint item in list)
				{
					float num2 = Vector3.Distance(((Component)item).transform.position, avoidNear.Value);
					if (num2 < num)
					{
						val = item;
						num = num2;
					}
				}
				list.Remove(val);
			}
			return ((Component)list[Random.Range(0, list.Count)]).transform.position;
		}

		private void OnDestroy()
		{
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_monsterVisual != (Object)null)
			{
				Object.Destroy((Object)(object)_monsterVisual);
			}
			if (!((Object)(object)avatar != (Object)null))
			{
				return;
			}
			SetPlayerVisualsVisible(visible: true);
			SetInventoryHudVisible(visible: true);
			SetFlashlightActive(active: true);
			SetEnergyHudVisible(visible: true);
			if (GameFieldAccess.GetIsLocal(avatar) && (Object)(object)PlayerController.instance != (Object)null)
			{
				if (_jumpForceCaptured)
				{
					PlayerController.instance.JumpForce = _originalJumpForce;
				}
				if (_sprintSpeedCaptured)
				{
					PlayerController.instance.SprintSpeed = _originalSprintSpeed;
				}
				if (_debugEnergyCaptured)
				{
					PlayerController.instance.DebugEnergy = _originalDebugEnergy;
				}
			}
			if (_cameraPlayerOffsetCaptured && (Object)(object)CameraPosition.instance != (Object)null)
			{
				CameraPosition.instance.playerOffset = _originalCameraPlayerOffset;
			}
			if (_healthApplied && (Object)(object)avatar.playerHealth != (Object)null)
			{
				int health = GameFieldAccess.GetHealth(avatar.playerHealth);
				int num = (((Object)(object)moveset != (Object)null) ? moveset.MonsterMaxHealth : health);
				float num2 = ((num > 0) ? ((float)health / (float)num) : 1f);
				GameFieldAccess.SetMaxHealth(avatar.playerHealth, _originalMaxHealth);
				GameFieldAccess.SetHealth(avatar.playerHealth, Mathf.Clamp(Mathf.RoundToInt((float)_originalMaxHealth * num2), 1, _originalMaxHealth));
			}
		}
	}
	public class MonsterRevealUI : MonoBehaviour
	{
		private enum State
		{
			Hidden,
			FadingIn,
			Visible,
			FadingOut
		}

		public static MonsterRevealUI instance;

		public float displayDuration = 4f;

		public float fadeDuration = 0.5f;

		private CanvasGroup _canvasGroup;

		private Image _background;

		private TextMeshProUGUI _text;

		private float _timer;

		private State _state;

		public static void EnsureInstance()
		{
			//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_001e: Expected O, but got Unknown
			if (!((Object)(object)instance != (Object)null))
			{
				GameObject val = new GameObject("BecomeTheMonster_RevealUI");
				Object.DontDestroyOnLoad((Object)val);
				instance = val.AddComponent<MonsterRevealUI>();
				instance.BuildUI();
			}
		}

		private void BuildUI()
		{
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Expected O, but got Unknown
			//IL_006d: 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_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Expected O, but got Unknown
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: 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_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_016c: Unknown result type (might be due to invalid IL or missing references)
			Canvas obj = ((Component)this).gameObject.AddComponent<Canvas>();
			obj.renderMode = (RenderMode)0;
			obj.sortingOrder = 32767;
			_canvasGroup = ((Component)this).gameObject.AddComponent<CanvasGroup>();
			_canvasGroup.alpha = 0f;
			_canvasGroup.blocksRaycasts = false;
			GameObject val = new GameObject("Background");
			val.transform.SetParent(((Component)this).transform, false);
			RectTransform obj2 = val.AddComponent<RectTransform>();
			obj2.anchorMin = Vector2.zero;
			obj2.anchorMax = Vector2.one;
			obj2.offsetMin = Vector2.zero;
			obj2.offsetMax = Vector2.zero;
			_background = val.AddComponent<Image>();
			((Graphic)_background).color = Color.black;
			GameObject val2 = new GameObject("RevealText");
			val2.transform.SetParent(((Component)this).transform, false);
			RectTransform obj3 = val2.AddComponent<RectTransform>();
			obj3.anchorMin = new Vector2(0.5f, 0.5f);
			obj3.anchorMax = new Vector2(0.5f, 0.5f);
			obj3.sizeDelta = new Vector2(1600f, 400f);
			obj3.anchoredPosition = Vector2.zero;
			_text = val2.AddComponent<TextMeshProUGUI>();
			((TMP_Text)_text).alignment = (TextAlignmentOptions)514;
			((TMP_Text)_text).fontSize = 90f;
			((TMP_Text)_text).fontStyle = (FontStyles)1;
			((Graphic)_text).color = new Color(0.9f, 0.05f, 0.05f);
			((TMP_Text)_text).enableAutoSizing = true;
			((TMP_Text)_text).fontSizeMin = 24f;
			((TMP_Text)_text).fontSizeMax = 120f;
		}

		public void Show(List<(string playerName, string formName)> revealed, bool localIsMonster, string localFormName)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			if (localIsMonster)
			{
				((Behaviour)_background).enabled = true;
				((Graphic)_background).color = Color.black;
				((TMP_Text)_text).fontSize = 90f;
				((TMP_Text)_text).text = "YOU ARE THE " + localFormName.ToUpperInvariant();
			}
			else
			{
				((Behaviour)_background).enabled = false;
				((TMP_Text)_text).fontSize = 48f;
				StringBuilder stringBuilder = new StringBuilder();
				foreach (var item in revealed)
				{
					stringBuilder.AppendLine(item.playerName + " has become " + item.formName);
				}
				((TMP_Text)_text).text = stringBuilder.ToString().TrimEnd();
			}
			_timer = 0f;
			_state = State.FadingIn;
		}

		private void Update()
		{
			if (_state == State.Hidden)
			{
				return;
			}
			_timer += Time.deltaTime;
			switch (_state)
			{
			case State.FadingIn:
				_canvasGroup.alpha = Mathf.Clamp01(_timer / fadeDuration);
				if (_timer >= fadeDuration)
				{
					_timer = 0f;
					_state = State.Visible;
				}
				break;
			case State.Visible:
				if (_timer >= displayDuration)
				{
					_timer = 0f;
					_state = State.FadingOut;
				}
				break;
			case State.FadingOut:
				_canvasGroup.alpha = 1f - Mathf.Clamp01(_timer / fadeDuration);
				if (_timer >= fadeDuration)
				{
					_canvasGroup.alpha = 0f;
					_state = State.Hidden;
				}
				break;
			}
		}
	}
	public static class VfxMaterial
	{
		private static Shader _cachedShader;

		public static Material CreateUnlit(Color color)
		{
			//IL_0013: 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)
			Shader safeShader = GetSafeShader();
			Material val = ((!((Object)(object)safeShader != (Object)null)) ? ((Material)null) : new Material(safeShader));
			if ((Object)(object)val == (Object)null)
			{
				Debug.LogError((object)"[BecomeTheMonster] No usable shader found for VFX material — skipping this effect.");
				return null;
			}
			val.color = color;
			return val;
		}

		private static Shader GetSafeShader()
		{
			if ((Object)(object)_cachedShader != (Object)null)
			{
				return _cachedShader;
			}
			Shader val = Shader.Find("Universal Render Pipeline/Unlit");
			if ((Object)(object)val == (Object)null)
			{
				val = Shader.Find("Universal Render Pipeline/Lit");
			}
			if ((Object)(object)val == (Object)null)
			{
				Renderer val2 = Object.FindObjectOfType<Renderer>();
				if ((Object)(object)val2 != (Object)null && (Object)(object)val2.sharedMaterial != (Object)null)
				{
					val = val2.sharedMaterial.shader;
				}
			}
			_cachedShader = val;
			return val;
		}
	}
}
namespace BecomeTheMonster.Movesets
{
	public class BangMoveset : MonsterMoveset
	{
		public float explosionRadius = 5f;

		public int explosionDamage = 35;

		public float fuseDuration = 1.5f;

		private const float FlashDuration = 0.25f;

		private GameObject _flash;

		private float _flashTimer;

		private bool _fuseLit;

		private float _fuseTimer;

		private Light _fuseGlow;

		public override bool AllowJump => true;

		public override bool AllowCrouch => true;

		public override float MoveSpeedMultiplier => 1.15f;

		public override float AttackCooldown => 4f;

		public override string AttackDisplayName => "Light Fuse";

		public override Color HudColor => new Color(1f, 0.55f, 0.1f);

		public override int MonsterMaxHealth => 50;

		protected override void OnInit()
		{
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Expected O, but got Unknown
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			_flash = GameObject.CreatePrimitive((PrimitiveType)0);
			((Object)_flash).name = "BangExplosionFlash";
			Collider component = _flash.GetComponent<Collider>();
			if ((Object)(object)component != (Object)null)
			{
				Object.Destroy((Object)(object)component);
			}
			MeshRenderer component2 = _flash.GetComponent<MeshRenderer>();
			((Renderer)component2).material = VfxMaterial.CreateUnlit(HudColor);
			((Renderer)component2).enabled = false;
			GameObject val = new GameObject("FuseGlow");
			val.transform.SetParent(((Component)this).transform, false);
			_fuseGlow = val.AddComponent<Light>();
			_fuseGlow.type = (LightType)2;
			_fuseGlow.color = HudColor;
			_fuseGlow.range = 4f;
			_fuseGlow.intensity = 0f;
			((Behaviour)_fuseGlow).enabled = false;
		}

		protected override void OnTick()
		{
			//IL_0051: 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_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_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			if (_flashTimer > 0f)
			{
				_flashTimer -= Time.deltaTime;
				float num = 1f - Mathf.Clamp01(_flashTimer / 0.25f);
				MeshRenderer component = _flash.GetComponent<MeshRenderer>();
				_flash.transform.localScale = Vector3.one * Mathf.Lerp(0.4f, explosionRadius * 2f, num);
				Color hudColor = HudColor;
				hudColor.a = Mathf.Lerp(0.9f, 0f, num);
				((Renderer)component).material.color = hudColor;
				if (_flashTimer <= 0f)
				{
					((Renderer)component).enabled = false;
				}
			}
			if (_fuseLit)
			{
				_fuseTimer -= Time.deltaTime;
				((Component)_fuseGlow).transform.position = ((Component)base.Avatar).transform.position + Vector3.up;
				float num2 = 1f - Mathf.Clamp01(_fuseTimer / fuseDuration);
				_fuseGlow.intensity = Mathf.Lerp(1f, 8f, num2) * (0.7f + 0.3f * Mathf.Sin(Time.time * Mathf.Lerp(4f, 20f, num2)));
				if (_fuseTimer <= 0f)
				{
					_fuseLit = false;
					((Behaviour)_fuseGlow).enabled = false;
					Detonate();
				}
			}
		}

		protected override void PerformAttack()
		{
			if (!_fuseLit)
			{
				_fuseLit = true;
				_fuseTimer = fuseDuration;
				((Behaviour)_fuseGlow).enabled = true;
				if ((Object)(object)base.MonsterAnimator != (Object)null)
				{
					base.MonsterAnimator.SetTrigger("fuse");
				}
			}
		}

		private void Detonate()
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_010f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: 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_014c: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0167: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = ((Component)base.Avatar).transform.position + Vector3.up;
			List<PlayerAvatar> list = new List<PlayerAvatar>();
			List<PhysGrabObject> list2 = new List<PhysGrabObject>();
			Collider[] array = Physics.OverlapSphere(val, explosionRadius);
			foreach (Collider val2 in array)
			{
				PlayerAvatar componentInParent = ((Component)val2).GetComponentInParent<PlayerAvatar>();
				if ((Object)(object)componentInParent != (Object)null && (Object)(object)componentInParent != (Object)(object)base.Avatar && !list.Contains(componentInParent))
				{
					list.Add(componentInParent);
					continue;
				}
				PhysGrabObject componentInParent2 = ((Component)val2).GetComponentInParent<PhysGrabObject>();
				if ((Object)(object)componentInParent2 != (Object)null && !list2.Contains(componentInParent2))
				{
					list2.Add(componentInParent2);
				}
			}
			foreach (PlayerAvatar item in list)
			{
				DamagePlayer(item, explosionDamage, ((Component)item).transform.position);
			}
			foreach (PhysGrabObject item2 in list2)
			{
				Vector3 val3 = ((Component)item2).transform.position - val;
				SmashObject(item2, ((Vector3)(ref val3)).normalized, 50f);
			}
			_flash.transform.position = val;
			_flash.transform.localScale = Vector3.one * 0.4f;
			((Renderer)_flash.GetComponent<MeshRenderer>()).enabled = true;
			_flashTimer = 0.25f;
			((MonoBehaviour)this).StartCoroutine(SelfDestructAfterFlash());
		}

		private IEnumerator SelfDestructAfterFlash()
		{
			yield return (object)new WaitForSeconds(0.25f);
			if ((Object)(object)base.Avatar != (Object)null && (Object)(object)base.Avatar.playerHealth != (Object)null)
			{
				base.Avatar.playerHealth.Hurt(9999, false, -1, false);
			}
		}

		private void OnDestroy()
		{
			if ((Object)(object)_flash != (Object)null)
			{
				Object.Destroy((Object)(object)_flash);
			}
			if ((Object)(object)_fuseGlow != (Object)null)
			{
				Object.Destroy((Object)(object)((Component)_fuseGlow).gameObject);
			}
		}
	}
	public class BeamerMoveset : DefaultMoveset
	{
		private const float AttackAnimHoldTime = 0.15f;

		private float _attackAnimTimer;

		private SemiLaser _realLaser;

		private Transform _laserStartTransform;

		public override float AttackCooldown => 0.3f;

		public override string AttackDisplayName => "Laser Beam";

		public override Color HudColor => new Color(1f, 0.35f, 0.05f);

		public override int MonsterMaxHealth => 250;

		protected override void OnInit()
		{
			attackRange = 10f;
			attackDamage = 12;
			tracerDuration = 0.15f;
			base.OnInit();
			EnemyBeamer val = (((Object)(object)base.Possession != (Object)null && (Object)(object)base.Possession.MonsterVisual != (Object)null) ? base.Possession.MonsterVisual.GetComponentInChildren<EnemyBeamer>(true) : null);
			if ((Object)(object)val != (Object)null && (Object)(object)val.laser != (Object)null)
			{
				_realLaser = val.laser;
				((Behaviour)_realLaser).enabled = true;
				_laserStartTransform = val.laserStartTransform;
			}
		}

		protected override void OnTick()
		{
			base.OnTick();
			if (!(_attackAnimTimer <= 0f))
			{
				_attackAnimTimer -= Time.deltaTime;
				if (_attackAnimTimer <= 0f && (Object)(object)base.MonsterAnimator != (Object)null)
				{
					base.MonsterAnimator.SetBool("attacking", false);
				}
			}
		}

		protected override void PerformAttack()
		{
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: 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)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)base.MonsterAnimator != (Object)null)
			{
				base.MonsterAnimator.SetTrigger("attack");
				base.MonsterAnimator.SetBool("attacking", true);
			}
			_attackAnimTimer = 0.15f;
			if ((Object)(object)_realLaser == (Object)null)
			{
				base.PerformAttack();
				return;
			}
			var (val, val2) = RaycastFromCamera(attackRange);
			if ((Object)(object)val != (Object)null)
			{
				DamagePlayer(val, attackDamage, val2);
			}
			Vector3 val3 = (((Object)(object)_laserStartTransform != (Object)null) ? _laserStartTransform.position : (((Object)(object)base.Cam != (Object)null) ? ((Component)base.Cam).transform.position : ((Component)this).transform.position));
			_realLaser.LaserActive(val3, val2, (Object)(object)val != (Object)null);
		}
	}
	public class BirthdayBoyMoveset : MonsterMoveset
	{
		private class Balloon
		{
			public GameObject visual;

			public float lifeRemaining;
		}

		public float attackRange = 2.2f;

		public float attackRadius = 1.3f;

		public int attackDamage = 25;

		public float lungeForce = 5f;

		public float lungeTime = 0.15f;

		[Header("Balloon")]
		public float balloonPlaceDistance = 3f;

		public float balloonPopRadius = 1.3f;

		public float balloonLifetime = 25f;

		public int maxActiveBalloons = 3;

		public int balloonAmbushDamage = 30;

		public float balloonAmbushRadius = 2f;

		private readonly List<Balloon> _balloons = new List<Balloon>();

		private GameObject _balloonPrefab;

		private const float PunchDuration = 0.15f;

		private float _punchTimer;

		private Vector3 _originalScale = Vector3.one;

		private bool _scaleCaptured;

		public override bool HasSecondaryAction => true;

		public override float SecondaryActionCooldown => 3f;

		public override string SecondaryActionDisplayName => "Place Balloon";

		public override bool AllowJump => false;

		public override bool AllowCrouch => true;

		public override float MoveSpeedMultiplier => 1.15f;

		public override float AttackCooldown => 1f;

		public override string AttackDisplayName => "Swipe";

		public override Color HudColor => new Color(1f, 0.35f, 0.65f);

		public override int MonsterMaxHealth => 150;

		protected override void OnInit()
		{
			EnemyBirthdayBoy val = (((Object)(object)base.Possession != (Object)null && (Object)(object)base.Possession.MonsterVisual != (Object)null) ? base.Possession.MonsterVisual.GetComponentInChildren<EnemyBirthdayBoy>(true) : null);
			_balloonPrefab = (((Object)(object)val != (Object)null) ? val.balloonPrefab : null);
		}

		protected override void OnTick()
		{
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			if (_punchTimer > 0f && (Object)(object)base.MonsterAnimator != (Object)null)
			{
				if (!_scaleCaptured)
				{
					_originalScale = ((Component)base.MonsterAnimator).transform.localScale;
					_scaleCaptured = true;
				}
				_punchTimer -= Time.deltaTime;
				float num = Mathf.Clamp01(_punchTimer / 0.15f);
				((Component)base.MonsterAnimator).transform.localScale = _originalScale * (1f + num * 0.15f);
				if (_punchTimer <= 0f)
				{
					((Component)base.MonsterAnimator).transform.localScale = _originalScale;
				}
			}
			TickBalloons();
		}

		private void TickBalloons()
		{
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: 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_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			for (int num = _balloons.Count - 1; num >= 0; num--)
			{
				Balloon balloon = _balloons[num];
				if ((Object)(object)balloon.visual == (Object)null)
				{
					_balloons.RemoveAt(num);
				}
				else
				{
					Transform transform = balloon.visual.transform;
					transform.position += Vector3.up * Mathf.Sin(Time.time * 2f + (float)num) * 0.15f * Time.deltaTime;
					balloon.lifeRemaining -= Time.deltaTime;
					if (balloon.lifeRemaining <= 0f)
					{
						Object.Destroy((Object)(object)balloon.visual);
						_balloons.RemoveAt(num);
					}
					else
					{
						bool flag = false;
						Collider[] array = Physics.OverlapSphere(balloon.visual.transform.position, balloonPopRadius);
						for (int i = 0; i < array.Length; i++)
						{
							PlayerAvatar componentInParent = ((Component)array[i]).GetComponentInParent<PlayerAvatar>();
							if ((Object)(object)componentInParent != (Object)null && (Object)(object)componentInParent != (Object)(object)base.Avatar)
							{
								flag = true;
								break;
							}
						}
						if (flag)
						{
							AmbushAtBalloon(balloon.visual.transform.position);
							Object.Destroy((Object)(object)balloon.visual);
							_balloons.RemoveAt(num);
						}
					}
				}
			}
		}

		private void AmbushAtBalloon(Vector3 position)
		{
			//IL_0006: 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_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: 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_0084: Unknown result type (might be due to invalid IL or missing references)
			base.Avatar.Spawn(position, ((Component)base.Avatar).transform.rotation);
			_punchTimer = 0.15f;
			if ((Object)(object)base.MonsterAnimator != (Object)null)
			{
				_originalScale = ((Component)base.MonsterAnimator).transform.localScale;
			}
			Collider[] array = Physics.OverlapSphere(position, balloonAmbushRadius);
			for (int i = 0; i < array.Length; i++)
			{
				PlayerAvatar componentInParent = ((Component)array[i]).GetComponentInParent<PlayerAvatar>();
				if ((Object)(object)componentInParent != (Object)null && (Object)(object)componentInParent != (Object)(object)base.Avatar)
				{
					DamagePlayer(componentInParent, balloonAmbushDamage, position);
				}
			}
		}

		protected override void PerformSecondaryAction()
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0074: 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_0089: 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)
			if (_balloons.Count >= maxActiveBalloons)
			{
				Balloon balloon = _balloons[0];
				if ((Object)(object)balloon.visual != (Object)null)
				{
					Object.Destroy((Object)(object)balloon.visual);
				}
				_balloons.RemoveAt(0);
			}
			Vector3 placePos = ((Component)base.Avatar).transform.position + Vector3.up * 1.2f + ((Component)base.Avatar).transform.forward * balloonPlaceDistance;
			GameObject visual = SpawnBalloonVisual(placePos);
			_balloons.Add(new Balloon
			{
				visual = visual,
				lifeRemaining = balloonLifetime
			});
		}

		private GameObject SpawnBalloonVisual(Vector3 placePos)
		{
			//IL_0078: 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_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: 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)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_balloonPrefab == (Object)null)
			{
				GameObject obj = GameObject.CreatePrimitive((PrimitiveType)0);
				((Object)obj).name = "BirthdayBoyBalloon";
				obj.transform.position = placePos;
				obj.transform.localScale = Vector3.one * 0.5f;
				Collider component = obj.GetComponent<Collider>();
				if ((Object)(object)component != (Object)null)
				{
					Object.Destroy((Object)(object)component);
				}
				((Renderer)obj.GetComponent<MeshRenderer>()).material = VfxMaterial.CreateUnlit(HudColor);
				return obj;
			}
			GameObject val = Object.Instantiate<GameObject>(_balloonPrefab, placePos, Quaternion.identity);
			((Object)val).name = "BirthdayBoyBalloon";
			BirthdayBoyBalloon component2 = val.GetComponent<BirthdayBoyBalloon>();
			if ((Object)(object)component2 != (Object)null && (Object)(object)component2.moveTransform != (Object)null)
			{
				component2.moveTransform.localPosition = Vector3.zero;
				component2.moveTransform.localScale = Vector3.one;
			}
			Behaviour[] componentsInChildren = val.GetComponentsInChildren<Behaviour>(true);
			for (int i = 0; i < componentsInChildren.Length; i++)
			{
				componentsInChildren[i].enabled = false;
			}
			Collider[] componentsInChildren2 = val.GetComponentsInChildren<Collider>(true);
			for (int i = 0; i < componentsInChildren2.Length; i++)
			{
				componentsInChildren2[i].enabled = false;
			}
			return val;
		}

		private void OnDestroy()
		{
			foreach (Balloon balloon in _balloons)
			{
				if ((Object)(object)balloon.visual != (Object)null)
				{
					Object.Destroy((Object)(object)balloon.visual);
				}
			}
			_balloons.Clear();
		}

		protected override void PerformAttack()
		{
			//IL_0028: 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_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: 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_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			_punchTimer = 0.15f;
			List<PlayerAvatar> list = OverlapPlayersInFront(attackRange, attackRadius);
			Vector3 hitPosition = ((Component)base.Avatar).transform.position + ((Component)base.Avatar).transform.forward * attackRange;
			foreach (PlayerAvatar item in list)
			{
				DamagePlayer(item, attackDamage, hitPosition);
			}
			if ((Object)(object)PlayerController.instance != (Object)null)
			{
				PlayerController.instance.MoveForce(((Component)base.Avatar).transform.forward, lungeForce, lungeTime);
			}
		}
	}
	public class BowtieMoveset : MonsterMoveset
	{
		public float yellRange = 5f;

		public float yellRadius = 3.5f;

		public int yellDamage = 24;

		public float yellAnimHoldTime = 0.5f;

		private float _yellAnimTimer;

		public override float AttackCooldown => 2.2f;

		public override string AttackDisplayName => "Yell";

		public override Color HudColor => new Color(0.95f, 0.55f, 0.05f);

		public override int MonsterMaxHealth => 200;

		public override float MoveSpeedMultiplier => 0.9f;

		protected override void OnTick()
		{
			if (!(_yellAnimTimer <= 0f))
			{
				_yellAnimTimer -= Time.deltaTime;
				if (_yellAnimTimer <= 0f && (Object)(object)base.MonsterAnimator != (Object)null)
				{
					base.MonsterAnimator.SetBool("yell", false);
				}
			}
		}

		protected override void PerformAttack()
		{
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)base.MonsterAnimator != (Object)null)
			{
				base.MonsterAnimator.SetTrigger("Notice");
				base.MonsterAnimator.SetBool("yell", true);
			}
			_yellAnimTimer = yellAnimHoldTime;
			foreach (PlayerAvatar item in OverlapPlayersInFront(yellRange, yellRadius))
			{
				DamagePlayer(item, yellDamage, ((Component)item).transform.position);
			}
		}
	}
	public class DefaultMoveset : MonsterMoveset
	{
		public float attackRange = 40f;

		public int attackDamage = 20;

		public float tracerDuration = 0.14f;

		private LineRenderer _tracer;

		private float _tracerTimer;

		public override float AttackCooldown => 0.6f;

		public override string AttackDisplayName => "Shoot";

		protected override void OnInit()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("Tracer");
			val.transform.SetParent(((Component)this).transform, false);
			_tracer = val.AddComponent<LineRenderer>();
			_tracer.positionCount = 2;
			_tracer.startWidth = 0.05f;
			_tracer.endWidth = 0.02f;
			((Renderer)_tracer).material = VfxMaterial.CreateUnlit(HudColor);
			_tracer.startColor = HudColor;
			_tracer.endColor = new Color(HudColor.r, HudColor.g, HudColor.b, 0.2f);
			((Renderer)_tracer).enabled = false;
		}

		protected override void OnTick()
		{
			if (!(_tracerTimer <= 0f))
			{
				_tracerTimer -= Time.deltaTime;
				if (_tracerTimer <= 0f)
				{
					((Renderer)_tracer).enabled = false;
				}
			}
		}

		protected override void PerformAttack()
		{
			//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_002a: 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)
			//IL_004b: 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)
			var (val, val2) = RaycastFromCamera(attackRange);
			if ((Object)(object)val != (Object)null)
			{
				DamagePlayer(val, attackDamage, val2);
			}
			_tracer.SetPosition(0, ((Object)(object)base.Cam != (Object)null) ? ((Component)base.Cam).transform.position : ((Component)this).transform.position);
			_tracer.SetPosition(1, val2);
			((Renderer)_tracer).enabled = true;
			_tracerTimer = tracerDuration;
		}
	}
	public class DuckMoveset : MonsterMoveset
	{
		public float attackRange = 2.2f;

		public float attackRadius = 1.1f;

		public int attackDamage = 25;

		public float lungeForce = 6f;

		public float lungeTime = 0.15f;

		public override bool AllowJump => true;

		public override float MoveSpeedMultiplier => 1.15f;

		public override float AttackCooldown => 1f;

		public override string AttackDisplayName => "Bite";

		public override Color HudColor => new Color(1f, 0.82f, 0.1f);

		public override int MonsterMaxHealth => 150;

		protected override void PerformAttack()
		{
			//IL_0053: 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_00a4: 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)
			if ((Object)(object)base.MonsterAnimator != (Object)null)
			{
				base.MonsterAnimator.SetTrigger("transform");
			}
			List<PlayerAvatar> list = OverlapPlayersInFront(attackRange, attackRadius);
			PlayerAvatar val = null;
			float num = float.MaxValue;
			foreach (PlayerAvatar item in list)
			{
				float num2 = Vector3.Distance(((Component)base.Avatar).transform.position, ((Component)item).transform.position);
				if (num2 < num)
				{
					num = num2;
					val = item;
				}
			}
			if ((Object)(object)val != (Object)null)
			{
				DamagePlayer(val, attackDamage, ((Component)val).transform.position);
			}
			if ((Object)(object)PlayerController.instance != (Object)null)
			{
				PlayerController.instance.MoveForce(((Component)base.Avatar).transform.forward, lungeForce, lungeTime);
			}
		}
	}
	public class ElsaMoveset : MonsterMoveset
	{
		private const float MaulRange = 2.2f;

		private const float MaulRadius = 1.5f;

		private const int MaulDamage = 32;

		private const float AngryTimerMax = 15f;

		private const float PetRadius = 2.5f;

		private float _angryTimer;

		private bool _isBig;

		private int _lastHealth = -1;

		private bool _lastHealthCaptured;

		public override bool AllowJump => _isBig;

		public override float MoveSpeedMultiplier
		{
			get
			{
				if (!_isBig)
				{
					return 0.9f;
				}
				return 1.1f;
			}
		}

		public override float AttackCooldown => 1.2f;

		public override string AttackDisplayName
		{
			get
			{
				if (!_isBig)
				{
					return "Calm";
				}
				return "Maul";
			}
		}

		public override Color HudColor => new Color(1f, 0.15f, 0.05f);

		public override int MonsterMaxHealth => 600;

		protected override void OnTick()
		{
			if ((Object)(object)base.Avatar != (Object)null && (Object)(object)base.Avatar.playerHealth != (Object)null)
			{
				int health = GameFieldAccess.GetHealth(base.Avatar.playerHealth);
				if (_lastHealthCaptured && health < _lastHealth)
				{
					_angryTimer = 15f;
				}
				_lastHealth = health;
				_lastHealthCaptured = true;
			}
			if (!_isBig)
			{
				if (IsBeingPetted())
				{
					_angryTimer = 0f;
				}
				else
				{
					_angryTimer += Time.deltaTime;
				}
				if (_angryTimer >= 15f)
				{
					TransformToBig();
				}
			}
		}

		private bool IsBeingPetted()
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)base.Avatar == (Object)null)
			{
				return false;
			}
			Collider[] array = Physics.OverlapSphere(((Component)base.Avatar).transform.position, 2.5f);
			for (int i = 0; i < array.Length; i++)
			{
				PlayerAvatar componentInParent = ((Component)array[i]).GetComponentInParent<PlayerAvatar>();
				if ((Object)(object)componentInParent != (Object)null && (Object)(object)componentInParent != (Object)(object)base.Avatar)
				{
					return true;
				}
			}
			return false;
		}

		private void TransformToBig()
		{
			_isBig = true;
			if ((Object)(object)base.MonsterAnimator != (Object)null)
			{
				base.MonsterAnimator.SetBool("isBig", true);
				base.MonsterAnimator.SetTrigger("TransformSmallToBig");
			}
		}

		protected override void PerformAttack()
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			if (!_isBig)
			{
				return;
			}
			foreach (PlayerAvatar item in OverlapPlayersInFront(2.2f, 1.5f))
			{
				DamagePlayer(item, 32, ((Component)item).transform.position);
			}
		}
	}
	public class FloaterMoveset : MonsterMoveset
	{
		public float attackRange = 4f;

		public int attackDamage = 45;

		public float pulseDuration = 0.35f;

		[Header("Force Field")]
		public float fieldRadius = 5f;

		public float fieldPushForce = 18f;

		public float fieldUpwardBias = 0.25f;

		public float fieldPulseDuration = 0.4f;

		private GameObject _pulseVisual;

		private MeshRenderer _pulseRenderer;

		private float _pulseTimer;

		private GameObject _fieldVisual;

		private MeshRenderer _fieldRenderer;

		private float _fieldTimer;

		private const float ChargeDuration = 0.5f;

		private const float DelayDuration = 0.4f;

		private bool _windingUp;

		private float _windupTimer;

		private int _windupStage;

		private static readonly Color FieldColor = new Color(0.75f, 0.95f, 1f);

		public override float AttackCooldown => 3.5f;

		public override string AttackDisplayName => "Telekinetic Slam";

		public override Color HudColor => new Color(0.55f, 0.85f, 1f);

		public override int MonsterMaxHealth => 150;

		public override bool AllowJump => false;

		public override bool AllowCrouch => false;

		public override float MoveSpeedMultiplier => 0.85f;

		public override bool HasSecondaryAction => true;

		public override float SecondaryActionCooldown => 5f;

		public override string SecondaryActionDisplayName => "Force Field";

		protected override void OnInit()
		{
			//IL_004b: 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)
			_pulseVisual = GameObject.CreatePrimitive((PrimitiveType)0);
			Object.Destroy((Object)(object)_pulseVisual.GetComponent<Collider>());
			_pulseVisual.transform.SetParent(((Component)this).transform, false);
			_pulseRenderer = _pulseVisual.GetComponent<MeshRenderer>();
			((Renderer)_pulseRenderer).material = VfxMaterial.CreateUnlit(HudColor);
			_pulseVisual.SetActive(false);
			_fieldVisual = GameObject.CreatePrimitive((PrimitiveType)0);
			Object.Destroy((Object)(object)_fieldVisual.GetComponent<Collider>());
			_fieldVisual.transform.SetParent(((Component)this).transform, false);
			_fieldRenderer = _fieldVisual.GetComponent<MeshRenderer>();
			((Renderer)_fieldRenderer).material = VfxMaterial.CreateUnlit(FieldColor);
			_fieldVisual.SetActive(false);
		}

		protected override void OnTick()
		{
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: 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_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: 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_012f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: 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_0179: Unknown result type (might be due to invalid IL or missing references)
			//IL_019c: Unknown result type (might be due to invalid IL or missing references)
			if (_pulseTimer > 0f)
			{
				_pulseTimer -= Time.deltaTime;
				float num = 1f - Mathf.Clamp01(_pulseTimer / pulseDuration);
				_pulseVisual.transform.position = ((Component)base.Avatar).transform.position + Vector3.up;
				_pulseVisual.transform.localScale = Vector3.one * Mathf.Lerp(0.5f, attackRange * 2f, num);
				Color hudColor = HudColor;
				hudColor.a = Mathf.Lerp(0.7f, 0f, num);
				((Renderer)_pulseRenderer).material.color = hudColor;
				if (_pulseTimer <= 0f)
				{
					_pulseVisual.SetActive(false);
				}
			}
			if (_fieldTimer > 0f)
			{
				_fieldTimer -= Time.deltaTime;
				float num2 = 1f - Mathf.Clamp01(_fieldTimer / fieldPulseDuration);
				_fieldVisual.transform.position = ((Component)base.Avatar).transform.position + Vector3.up;
				_fieldVisual.transform.localScale = Vector3.one * Mathf.Lerp(0.5f, fieldRadius * 2f, num2);
				Color fieldColor = FieldColor;
				fieldColor.a = Mathf.Lerp(0.6f, 0f, num2);
				((Renderer)_fieldRenderer).material.color = fieldColor;
				if (_fieldTimer <= 0f)
				{
					_fieldVisual.SetActive(false);
				}
			}
			if (!_windingUp)
			{
				return;
			}
			_windupTimer -= Time.deltaTime;
			if (_windupTimer > 0f)
			{
				return;
			}
			if (_windupStage == 0)
			{
				if ((Object)(object)base.MonsterAnimator != (Object)null)
				{
					base.MonsterAnimator.SetTrigger("DelayAttack");
				}
				_windupStage = 1;
				_windupTimer = 0.4f;
			}
			else
			{
				_windingUp = false;
				ResolveSlam();
			}
		}

		protected override void PerformAttack()
		{
			_windingUp = true;
			_windupStage = 0;
			_windupTimer = 0.5f;
			if ((Object)(object)base.MonsterAnimator != (Object)null)
			{
				base.MonsterAnimator.SetTrigger("ChargeAttack");
			}
		}

		private void ResolveSlam()
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: 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_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)base.MonsterAnimator != (Object)null)
			{
				base.MonsterAnimator.SetTrigger("Attack");
			}
			Vector3 val = ((Component)base.Avatar).transform.position + Vector3.up;
			List<PlayerAvatar> list = new List<PlayerAvatar>();
			List<PhysGrabObject> list2 = new List<PhysGrabObject>();
			Collider[] array = Physics.OverlapSphere(val, attackRange);
			foreach (Collider val2 in array)
			{
				PlayerAvatar componentInParent = ((Component)val2).GetComponentInParent<PlayerAvatar>();
				if ((Object)(object)componentInParent != (Object)null && (Object)(object)componentInParent != (Object)(object)base.Avatar && !list.Contains(componentInParent))
				{
					list.Add(componentInParent);
					DamagePlayer(componentInParent, attackDamage, ((Component)componentInParent).transform.position);
					continue;
				}
				PhysGrabObject componentInParent2 = ((Component)val2).GetComponentInParent<PhysGrabObject>();
				if ((Object)(object)componentInParent2 != (Object)null && !list2.Contains(componentInParent2))
				{
					list2.Add(componentInParent2);
				}
			}
			foreach (PhysGrabObject item in list2)
			{
				Vector3 up = Vector3.up;
				Vector3 val3 = ((Component)item).transform.position - val;
				SmashObject(item, up + ((Vector3)(ref val3)).normalized, 37.5f);
			}
			_pulseVisual.transform.position = val;
			_pulseVisual.SetActive(true);
			_pulseTimer = pulseDuration;
		}

		protected override void PerformSecondaryAction()
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: 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_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0057: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = ((Component)base.Avatar).transform.position + Vector3.up;
			Collider[] array = Physics.OverlapSphere(val, fieldRadius);
			foreach (Collider val2 in array)
			{
				PlayerAvatar componentInParent = ((Component)val2).GetComponentInParent<PlayerAvatar>();
				if ((Object)(object)componentInParent != (Object)null && (Object)(object)componentInParent != (Object)(object)base.Avatar)
				{
					PushPlayer(componentInParent, val);
					continue;
				}
				PhysGrabObject componentInParent2 = ((Component)val2).GetComponentInParent<PhysGrabObject>();
				if ((Object)(object)componentInParent2 != (Object)null)
				{
					Vector3 val3 = Vector3.up * fieldUpwardBias;
					Vector3 val4 = ((Component)componentInParent2).transform.position - val;
					SmashObject(componentInParent2, val3 + ((Vector3)(ref val4)).normalized, fieldPushForce);
				}
			}
			_fieldVisual.transform.position = val;
			_fieldVisual.SetActive(true);
			_fieldTimer = fieldPulseDuration;
		}

		private void PushPlayer(PlayerAvatar target, Vector3 center)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: 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_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			PlayerTumble tumble = GameFieldAccess.GetTumble(target);
			if (!((Object)(object)tumble == (Object)null))
			{
				Vector3 val = Vector3.up * fieldUpwardBias;
				Vector3 val2 = ((Component)target).transform.position - center;
				Vector3 val3 = val + ((Vector3)(ref val2)).normalized;
				tumble.TumbleRequest(true, false);
				tumble.TumbleForce(((Vector3)(ref val3)).normalized * fieldPushForce);
				tumble.TumbleOverrideTime(0.6f);
			}
		}
	}
	public class GnomeMoveset : MonsterMoveset
	{
		public float attackRange = 1.6f;

		public float attackRadius = 1.1f;

		public int attackDamage = 22;

		public override bool AllowJump => false;

		public override bool AllowCrouch => false;

		public override float MoveSpeedMultiplier => 0.75f;

		public override float AttackCooldown => 1.8f;

		public override string AttackDisplayName => "Pickaxe Swing";

		public override Color HudColor => new Color(0.45f, 0.75f, 0.25f);

		public override int MonsterMaxHealth => 20;

		protected override void PerformAttack()
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: 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_0079: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)base.MonsterAnimator != (Object)null)
			{
				base.MonsterAnimator.SetTrigger("Attack");
			}
			List<PlayerAvatar> list = OverlapPlayersInFront(attackRange, attackRadius);
			Vector3 hitPosition = ((Component)base.Avatar).transform.position + ((Component)base.Avatar).transform.forward * attackRange;
			foreach (PlayerAvatar item in list)
			{
				DamagePlayer(item, attackDamage, hitPosition);
			}
		}
	}
	public class HiddenMoveset : MonsterMoveset
	{
		public float grabRange = 2.2f;

		public float grabRadius = 1.3f;

		public int grabDamage = 28;

		public override bool AllowJump => true;

		public override float MoveSpeedMultiplier => 1.3f;

		public override float AttackCooldown => 1.4f;

		public override string AttackDisplayName => "Grab";

		public override Color HudColor => new Color(0.62f, 0.5f, 0.36f);

		public override int MonsterMaxHealth => 100;

		protected override void PerformAttack()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			List<PlayerAvatar> list = OverlapPlayersInFront(grabRange, grabRadius);
			if (list.Count == 0)
			{
				return;
			}
			PlayerAvatar val = null;
			float num = float.MaxValue;
			Vector3 position = ((Component)base.Avatar).transform.position;
			foreach (PlayerAvatar item in list)
			{
				float num2 = Vector3.Distance(position, ((Component)item).transform.position);
				if (num2 < num)
				{
					num = num2;
					val = item;
				}
			}
			if ((Object)(object)val != (Object)null)
			{
				DamagePlayer(val, grabDamage, ((Component)val).transform.position);
			}
		}
	}
	public class HunterMoveset : DefaultMoveset
	{
		private const float ShootingAnimHoldTime = 1f;

		private float _shootingAnimTimer;

		private const float AimDuration = 0.4f;

		private bool _aiming;

		private float _aimTimer;

		public override float AttackCooldown => 1.8f;

		public override string AttackDisplayName => "Rifle Shot";

		public override Color HudColor => new Color(1f, 0.5f, 0.05f);

		public override int MonsterMaxHealth => 250;

		protected override void OnInit()
		{
			attackRange = 45f;
			attackDamage = 35;
			tracerDuration = 0.18f;
			base.OnInit();
		}

		protected override void OnTick()
		{
			base.OnTick();
			if (_aiming)
			{
				_aimTimer -= Time.deltaTime;
				if (_aimTimer <= 0f)
				{
					_aiming = false;
					if ((Object)(object)base.MonsterAnimator != (Object)null)
					{
						base.MonsterAnimator.SetBool("Aiming", false);
					}
					FireShot();
				}
			}
			if (!(_shootingAnimTimer <= 0f))
			{
				_shootingAnimTimer -= Time.deltaTime;
				if (_shootingAnimTimer <= 0f && (Object)(object)base.MonsterAnimator != (Object)null)
				{
					base.MonsterAnimator.SetBool("Shooting", false);
				}
			}
		}

		protected override void PerformAttack()
		{
			_aiming = true;
			_aimTimer = 0.4f;
			if ((Object)(object)base.MonsterAnimator != (Object)null)
			{
				base.MonsterAnimator.SetBool("Aiming", true);
			}
		}

		private void FireShot()
		{
			if ((Object)(object)base.MonsterAnimator != (Object)null)
			{
				base.MonsterAnimator.SetBool("Shooting", true);
			}
			_shootingAnimTimer = 1f;
			base.PerformAttack();
		}
	}
	public abstract class MonsterMoveset : MonoBehaviour
	{
		private float _cooldownTimer;

		private float _secondaryCooldownTimer;

		private float _suppressMovingTimer;

		private const float SuppressMovingDuration = 0.5f;

		protected const float DefaultObjectSmashForce = 25f;

		protected PlayerAvatar Avatar { get; private set; }

		protected Animator MonsterAnimator { get; private set; }

		protected MonsterPossession Possession { get; private set; }

		protected Camera Cam => Camera.main;

		public virtual bool AllowJump => false;

		public virtual bool AllowCrouch => false;

		public virtual float MoveSpeedMultiplier => 1f;

		public virtual int MonsterMaxHealth => 150;

		public abstract float AttackCooldown { get; }

		public abstract string AttackDisplayName { get; }

		public virtual Color HudColor => new Color(0.9f, 0.1f, 0.1f);

		public float CooldownFraction
		{
			get
			{
				if (!(AttackCooldown > 0f))
				{
					return 1f;
				}
				return Mathf.Clamp01(1f - _cooldownTimer / AttackCooldown);
			}
		}

		public virtual bool HasSecondaryAction => false;

		public virtual float SecondaryActionCooldown => 1f;

		public virtual string SecondaryActionDisplayName => "";

		public float SecondaryCooldownFraction
		{
			get
			{
				if (!(SecondaryActionCooldown > 0f))
				{
					return 1f;
				}
				return Mathf.Clamp01(1f - _secondaryCooldownTimer / SecondaryActionCooldown);
			}
		}

		internal bool SuppressMovingAnimation => _suppressMovingTi