Decompiled source of MonsterEscortGamemode v1.0.0

MonsterEscort.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using MonsterEscort.Core;
using MonsterEscort.Systems;
using MonsterEscort.UI;
using On.RoR2;
using On.RoR2.UI;
using R2API.Networking;
using R2API.Networking.Interfaces;
using RoR2;
using RoR2.UI;
using TMPro;
using UnityEngine;
using UnityEngine.Networking;
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("MonsterEscort")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("MonsterEscort")]
[assembly: AssemblyTitle("MonsterEscort")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace MonsterEscort.UI
{
	public static class HealthBarAssets
	{
		public static Sprite BuildBackgroundSprite(int width, int height, int edgeFadePixels, int borderPixels, float borderAlphaMult)
		{
			//IL_0028: 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_0035: Expected O, but got Unknown
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			width = Mathf.Max(1, width);
			height = Mathf.Max(1, height);
			edgeFadePixels = Mathf.Clamp(edgeFadePixels, 0, Mathf.Max(0, width / 2));
			Texture2D val = new Texture2D(width, height, (TextureFormat)5, false)
			{
				wrapMode = (TextureWrapMode)1
			};
			for (int i = 0; i < height; i++)
			{
				float num = ((i < borderPixels || i >= height - borderPixels) ? borderAlphaMult : 1f);
				for (int j = 0; j < width; j++)
				{
					float num2 = ((j >= edgeFadePixels) ? ((j < width - edgeFadePixels) ? 1f : ((edgeFadePixels == 0) ? 1f : ((float)(width - 1 - j) / (float)edgeFadePixels))) : ((edgeFadePixels == 0) ? 1f : ((float)j / (float)edgeFadePixels)));
					num2 = Mathf.Clamp01(num2 * num);
					val.SetPixel(j, i, new Color(1f, 1f, 1f, num2));
				}
			}
			val.Apply(false, true);
			return Sprite.Create(val, new Rect(0f, 0f, (float)width, (float)height), new Vector2(0.5f, 0.5f), 100f);
		}

		public static Sprite BuildStressGradientSprite(int width, int height)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			width = Mathf.Max(1, width);
			height = Mathf.Max(1, height);
			Texture2D val = new Texture2D(width, height, (TextureFormat)5, false)
			{
				wrapMode = (TextureWrapMode)1
			};
			Color val2 = default(Color);
			for (int i = 0; i < height; i++)
			{
				for (int j = 0; j < width; j++)
				{
					float num = (float)j / (float)(width - 1) * 0.8f;
					((Color)(ref val2))..ctor(0.8f, 0.8f - num, 0f, 0.6f);
					val.SetPixel(j, i, val2);
				}
			}
			val.Apply(false, true);
			return Sprite.Create(val, new Rect(0f, 0f, (float)width, (float)height), new Vector2(0.5f, 0.5f), 100f);
		}
	}
	public class HealthBarView : MonoBehaviour
	{
		public Color BarColor = new Color(0f, 0f, 0f, 0.75f);

		public int EdgeFadePixels = 64;

		public int BorderPixels = 3;

		public float BorderAlphaMult = 1.1f;

		public Vector4 FillInset = new Vector4(4f, 2f, 4f, 2f);

		public Color FillColor = new Color(0.3f, 0.8f, 0.25f, 0.6f);

		public int StripePixels = 1;

		public float TopDarkenAlpha = 0.18f;

		public float BotLightenAlpha = 0.14f;

		public float LowHealthThreshold = 0.25f;

		public Color FlashColorA = Color.white;

		public Color FlashColorB = new Color(1f, 0.2f, 0.2f, 1f);

		public float StressHeight = 5f;

		public float StressGap = 3f;

		public float StressWidthScale = 0.8f;

		public float StressTrackAlpha = 0.75f;

		public int StressBorderPx = 1;

		private Image _bg;

		private RectTransform _mask;

		private RectTransform _fillContent;

		private Image _fillBase;

		private Image _stripeTop;

		private Image _stripeBot;

		private RectTransform _stressMask;

		private RectTransform _stressFill;

		private Image _stressImg;

		private Image _stressTrack;

		private float _lastFrac;

		private float _stressMaxWidth = 1f;

		public Vector2 BarSize;

		public Vector2 BarAnchor;

		public Vector2 BarPosition;

		public RectTransform Root { get; private set; }

		public HGTextMeshProUGUI LabelTMP { get; private set; }

		public void Build(Transform hudMainContainer)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			//IL_0034: 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_0049: Expected O, but got Unknown
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: 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)
			//IL_00a8: Expected O, but got Unknown
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_012a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: Expected O, but got Unknown
			//IL_0174: Unknown result type (might be due to invalid IL or missing references)
			//IL_018e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d8: Expected O, but got Unknown
			//IL_0204: Unknown result type (might be due to invalid IL or missing references)
			//IL_020f: Unknown result type (might be due to invalid IL or missing references)
			//IL_021a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0224: Unknown result type (might be due to invalid IL or missing references)
			//IL_0235: Unknown result type (might be due to invalid IL or missing references)
			//IL_0244: Unknown result type (might be due to invalid IL or missing references)
			//IL_024b: Expected O, but got Unknown
			//IL_0281: Unknown result type (might be due to invalid IL or missing references)
			//IL_0296: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0300: Unknown result type (might be due to invalid IL or missing references)
			//IL_0307: Expected O, but got Unknown
			//IL_033d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0352: Unknown result type (might be due to invalid IL or missing references)
			//IL_0367: Unknown result type (might be due to invalid IL or missing references)
			//IL_037e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0388: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_03bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c3: Expected O, but got Unknown
			//IL_03ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_03fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0405: Unknown result type (might be due to invalid IL or missing references)
			//IL_040f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0467: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("EscortBarRoot");
			val.transform.SetParent(hudMainContainer, false);
			Root = val.AddComponent<RectTransform>();
			Root.pivot = new Vector2(0.5f, 1f);
			GameObject val2 = new GameObject("BG");
			val2.transform.SetParent((Transform)(object)Root, false);
			_bg = val2.AddComponent<Image>();
			RectTransform rectTransform = ((Graphic)_bg).rectTransform;
			rectTransform.anchorMin = Vector2.zero;
			rectTransform.anchorMax = Vector2.one;
			rectTransform.offsetMin = Vector2.zero;
			rectTransform.offsetMax = Vector2.zero;
			GameObject val3 = new GameObject("FillMask");
			val3.transform.SetParent((Transform)(object)Root, false);
			_mask = val3.AddComponent<RectTransform>();
			_mask.anchorMin = Vector2.zero;
			_mask.anchorMax = Vector2.one;
			_mask.offsetMin = new Vector2(FillInset.x, FillInset.y);
			_mask.offsetMax = new Vector2(0f - FillInset.z, 0f - FillInset.w);
			val3.AddComponent<RectMask2D>();
			GameObject val4 = new GameObject("FillContent");
			val4.transform.SetParent((Transform)(object)_mask, false);
			_fillContent = val4.AddComponent<RectTransform>();
			_fillContent.anchorMin = new Vector2(0f, 0f);
			_fillContent.anchorMax = new Vector2(0f, 1f);
			_fillContent.pivot = new Vector2(0f, 0.5f);
			_fillContent.sizeDelta = new Vector2(0f, 0f);
			GameObject val5 = new GameObject("Base");
			val5.transform.SetParent((Transform)(object)_fillContent, false);
			_fillBase = val5.AddComponent<Image>();
			RectTransform rectTransform2 = ((Graphic)_fillBase).rectTransform;
			rectTransform2.anchorMin = Vector2.zero;
			rectTransform2.anchorMax = Vector2.one;
			rectTransform2.offsetMin = Vector2.zero;
			rectTransform2.offsetMax = Vector2.zero;
			((Graphic)_fillBase).color = FillColor;
			GameObject val6 = new GameObject("TopStripe");
			val6.transform.SetParent((Transform)(object)_fillContent, false);
			_stripeTop = val6.AddComponent<Image>();
			RectTransform rectTransform3 = ((Graphic)_stripeTop).rectTransform;
			rectTransform3.anchorMin = new Vector2(0f, 1f);
			rectTransform3.anchorMax = new Vector2(1f, 1f);
			rectTransform3.pivot = new Vector2(0.5f, 1f);
			rectTransform3.sizeDelta = new Vector2(0f, (float)StripePixels);
			rectTransform3.anchoredPosition = Vector2.zero;
			((Graphic)_stripeTop).color = new Color(1f, 1f, 1f, BotLightenAlpha);
			GameObject val7 = new GameObject("BottomStripe");
			val7.transform.SetParent((Transform)(object)_fillContent, false);
			_stripeBot = val7.AddComponent<Image>();
			RectTransform rectTransform4 = ((Graphic)_stripeBot).rectTransform;
			rectTransform4.anchorMin = new Vector2(0f, 0f);
			rectTransform4.anchorMax = new Vector2(1f, 0f);
			rectTransform4.pivot = new Vector2(0.5f, 0f);
			rectTransform4.sizeDelta = new Vector2(0f, (float)StripePixels);
			rectTransform4.anchoredPosition = Vector2.zero;
			((Graphic)_stripeBot).color = new Color(0f, 0f, 0f, TopDarkenAlpha);
			GameObject val8 = new GameObject("Label");
			val8.transform.SetParent((Transform)(object)Root, false);
			LabelTMP = val8.AddComponent<HGTextMeshProUGUI>();
			RectTransform rectTransform5 = ((TMP_Text)LabelTMP).rectTransform;
			rectTransform5.anchorMin = Vector2.zero;
			rectTransform5.anchorMax = Vector2.one;
			rectTransform5.offsetMin = Vector2.zero;
			rectTransform5.offsetMax = Vector2.zero;
			((TMP_Text)LabelTMP).enableWordWrapping = false;
			((TMP_Text)LabelTMP).alignment = (TextAlignmentOptions)4098;
			((TMP_Text)LabelTMP).fontSize = 18f;
			((Graphic)LabelTMP).raycastTarget = false;
			((TMP_Text)LabelTMP).text = "TEST";
			((Graphic)LabelTMP).color = Color.white;
			val8.transform.SetAsLastSibling();
			ApplyLayout();
			BuildStressUI();
			SetVisible(v: false);
		}

		public void ApplyLayout()
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			GetBarPosition(out BarSize, out BarAnchor, out BarPosition);
			if (Object.op_Implicit((Object)(object)Root))
			{
				Root.anchorMin = BarAnchor;
				Root.anchorMax = BarAnchor;
				Root.pivot = new Vector2(0.5f, 1f);
				Root.sizeDelta = BarSize;
				Root.anchoredPosition = BarPosition;
				Sprite sprite = HealthBarAssets.BuildBackgroundSprite(Mathf.RoundToInt(BarSize.x), Mathf.RoundToInt(BarSize.y), EdgeFadePixels, BorderPixels, BorderAlphaMult);
				_bg.sprite = sprite;
				_bg.type = (Type)0;
				((Graphic)_bg).color = BarColor;
				if (Object.op_Implicit((Object)(object)_mask))
				{
					_mask.offsetMin = new Vector2(FillInset.x, FillInset.y);
					_mask.offsetMax = new Vector2(0f - FillInset.z, 0f - FillInset.w);
				}
				RebuildStressGradient();
				SetFillFraction(_lastFrac);
			}
		}

		public void GetBarPosition(out Vector2 size, out Vector2 anchor, out Vector2 position)
		{
			//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_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_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)
			size = new Vector2(1100f, 16f);
			anchor = new Vector2(0.5f, 1f);
			position = new Vector2(0f, -180f);
		}

		public void SetVisible(bool v)
		{
			if (Object.op_Implicit((Object)(object)Root))
			{
				((Component)Root).gameObject.SetActive(v);
			}
		}

		public void SetLabel(string text)
		{
			if (Object.op_Implicit((Object)(object)LabelTMP))
			{
				((TMP_Text)LabelTMP).text = text;
			}
		}

		public void SetFillFraction(float frac)
		{
			//IL_0038: 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)
			if (!((Object)(object)_fillContent == (Object)null))
			{
				frac = Mathf.Clamp01(frac);
				_lastFrac = frac;
				float num;
				if (!Object.op_Implicit((Object)(object)_mask))
				{
					num = 0f;
				}
				else
				{
					Rect rect = _mask.rect;
					num = ((Rect)(ref rect)).width * frac;
				}
				float num2 = num;
				_fillContent.SetSizeWithCurrentAnchors((Axis)0, num2);
			}
		}

		public void SetFillColor(Color c)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)_fillBase))
			{
				((Graphic)_fillBase).color = c;
			}
		}

		public Color GetFillColor()
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)_fillBase))
			{
				return Color.white;
			}
			return ((Graphic)_fillBase).color;
		}

		public void RebuildStressGradient()
		{
			//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)
			if (Object.op_Implicit((Object)(object)_stressImg) && Object.op_Implicit((Object)(object)Root))
			{
				Rect rect = Root.rect;
				_stressMaxWidth = Mathf.Max(1f, ((Rect)(ref rect)).width * Mathf.Max(0f, StressWidthScale));
				((Graphic)_stressTrack).rectTransform.SetSizeWithCurrentAnchors((Axis)0, _stressMaxWidth);
				_stressFill.SetSizeWithCurrentAnchors((Axis)0, _stressMaxWidth);
				Sprite sprite = HealthBarAssets.BuildStressGradientSprite(Mathf.RoundToInt(_stressMaxWidth), Mathf.RoundToInt(StressHeight));
				_stressImg.sprite = sprite;
			}
		}

		public void SetStressFraction(float v01)
		{
			if (Object.op_Implicit((Object)(object)_stressMask))
			{
				_stressMask.SetSizeWithCurrentAnchors((Axis)0, _stressMaxWidth * Mathf.Clamp01(v01));
			}
		}

		public void BuildStressUI()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: 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_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Expected O, but got Unknown
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0176: Unknown result type (might be due to invalid IL or missing references)
			//IL_018c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0192: Expected O, but got Unknown
			//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01da: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_020e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0235: Unknown result type (might be due to invalid IL or missing references)
			//IL_023a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0267: Unknown result type (might be due to invalid IL or missing references)
			//IL_027c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0291: 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_02c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0306: Unknown result type (might be due to invalid IL or missing references)
			//IL_031b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0330: Unknown result type (might be due to invalid IL or missing references)
			//IL_0346: Unknown result type (might be due to invalid IL or missing references)
			//IL_0364: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("StressTrack");
			val.transform.SetParent((Transform)(object)Root, false);
			_stressTrack = val.AddComponent<Image>();
			RectTransform rectTransform = ((Graphic)_stressTrack).rectTransform;
			rectTransform.anchorMin = new Vector2(0.5f, 0f);
			rectTransform.anchorMax = new Vector2(0.5f, 0f);
			rectTransform.pivot = new Vector2(0.5f, 0.5f);
			rectTransform.sizeDelta = new Vector2(0f, StressHeight);
			rectTransform.anchoredPosition = new Vector2(0f, 0f - StressGap);
			((Graphic)_stressTrack).color = new Color(0f, 0f, 0f, StressTrackAlpha);
			val.transform.SetSiblingIndex(0);
			GameObject val2 = new GameObject("StressMask");
			val2.transform.SetParent(((Component)_stressTrack).transform, false);
			_stressMask = val2.AddComponent<RectTransform>();
			_stressMask.anchorMin = new Vector2(0f, 0f);
			_stressMask.anchorMax = new Vector2(0f, 1f);
			_stressMask.pivot = new Vector2(0f, 0.5f);
			_stressMask.sizeDelta = new Vector2(0f, 0f);
			_stressMask.anchoredPosition = new Vector2(0f, 0f);
			val2.AddComponent<RectMask2D>();
			GameObject val3 = new GameObject("StressFill");
			val3.transform.SetParent((Transform)(object)_stressMask, false);
			_stressFill = val3.AddComponent<RectTransform>();
			_stressFill.anchorMin = new Vector2(0f, 0f);
			_stressFill.anchorMax = new Vector2(0f, 1f);
			_stressFill.pivot = new Vector2(0f, 0.5f);
			_stressFill.sizeDelta = new Vector2(0f, 0f);
			_stressImg = val3.AddComponent<Image>();
			_stressImg.type = (Type)0;
			GameObject val4 = new GameObject("TopBorder");
			val4.transform.SetParent(((Component)_stressTrack).transform, false);
			Image obj = val4.AddComponent<Image>();
			RectTransform rectTransform2 = ((Graphic)obj).rectTransform;
			rectTransform2.anchorMin = new Vector2(0f, 1f);
			rectTransform2.anchorMax = new Vector2(1f, 1f);
			rectTransform2.pivot = new Vector2(0.5f, 1f);
			rectTransform2.sizeDelta = new Vector2(0f, (float)StressBorderPx);
			((Graphic)obj).color = new Color(1f, 1f, 1f, 0.08f);
			GameObject val5 = new GameObject("BotBorder");
			val5.transform.SetParent(((Component)_stressTrack).transform, false);
			Image obj2 = val5.AddComponent<Image>();
			RectTransform rectTransform3 = ((Graphic)obj2).rectTransform;
			rectTransform3.anchorMin = new Vector2(0f, 0f);
			rectTransform3.anchorMax = new Vector2(1f, 0f);
			rectTransform3.pivot = new Vector2(0.5f, 0f);
			rectTransform3.sizeDelta = new Vector2(0f, (float)StressBorderPx);
			((Graphic)obj2).color = new Color(0f, 0f, 0f, 0.2f);
			RebuildStressGradient();
			SetStressFraction(0f);
		}
	}
}
namespace MonsterEscort.Systems
{
	public static class CameraSystem
	{
		public static void ForceSpectateAll(CharacterBody escortBody)
		{
			if (!Object.op_Implicit((Object)(object)escortBody))
			{
				return;
			}
			Transform transform = ((Component)escortBody).transform;
			foreach (NetworkUser readOnlyInstances in NetworkUser.readOnlyInstancesList)
			{
				Camera val = readOnlyInstances?.cameraRigController?.sceneCam;
				if (Object.op_Implicit((Object)(object)val))
				{
					CameraHoldForward obj = ((Component)val).gameObject.GetComponent<CameraHoldForward>() ?? ((Component)val).gameObject.AddComponent<CameraHoldForward>();
					float bodyCameraDistance = GetBodyCameraDistance(escortBody);
					obj.target = transform;
					obj.forward = bodyCameraDistance * 1.2f;
					obj.up = bodyCameraDistance * 0.4f;
					obj.right = 0f;
					obj.duration = 6f;
				}
			}
		}

		public static float GetBodyCameraDistance(CharacterBody body)
		{
			if (!Object.op_Implicit((Object)(object)body))
			{
				return 6f;
			}
			return Mathf.Clamp(body.bestFitRadius * 3f, 4f, 12f);
		}
	}
	public class CameraHoldForward : MonoBehaviour
	{
		public Transform target;

		public float forward = 6f;

		public float up = 2f;

		public float right;

		public float duration = 5f;

		private Transform _parent;

		private Vector3 _origLocalPos;

		private Quaternion _origLocalRot;

		private float _end;

		private void OnEnable()
		{
			//IL_002a: 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)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			_end = Time.unscaledTime + duration;
			_parent = ((Component)this).transform.parent;
			_origLocalPos = ((Component)this).transform.localPosition;
			_origLocalRot = ((Component)this).transform.localRotation;
			((Component)this).transform.SetParent((Transform)null, true);
		}

		private void OnDisable()
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)_parent))
			{
				((Component)this).transform.SetParent(_parent, false);
				((Component)this).transform.localPosition = _origLocalPos;
				((Component)this).transform.localRotation = _origLocalRot;
			}
		}

		private void LateUpdate()
		{
			//IL_0027: 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_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: 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_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: 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_009b: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)target) || Time.unscaledTime > _end)
			{
				Object.Destroy((Object)(object)this);
				return;
			}
			Vector3 val = target.position + target.forward * forward + Vector3.up * up + target.right * right;
			Quaternion val2 = Quaternion.LookRotation(target.position - val, Vector3.up);
			((Component)this).transform.SetPositionAndRotation(val, val2);
		}
	}
	public class HealthBarController : MonoBehaviour
	{
		public struct StressMsg : INetMessage, ISerializableObject
		{
			public uint masterId;

			public float value;

			public bool echoed;

			public readonly void Serialize(NetworkWriter w)
			{
				w.Write(masterId);
				w.Write(value);
				w.Write(echoed);
			}

			public void Deserialize(NetworkReader r)
			{
				masterId = r.ReadUInt32();
				value = r.ReadSingle();
				echoed = r.ReadBoolean();
			}

			public void OnReceived()
			{
				//IL_002e: Unknown result type (might be due to invalid IL or missing references)
				if (NetworkServer.active)
				{
					if (!echoed)
					{
						echoed = true;
						NetMessageExtensions.Send((INetMessage)(object)this, (NetworkDestination)1);
					}
					return;
				}
				GameObject val = ClientScene.FindLocalObject(new NetworkInstanceId(masterId));
				CharacterMaster val2 = (Object.op_Implicit((Object)(object)val) ? val.GetComponent<CharacterMaster>() : null);
				if (Object.op_Implicit((Object)(object)val2))
				{
					val2.GetBody();
				}
				HealthBarController clientInstance = ClientInstance;
				if (Object.op_Implicit((Object)(object)clientInstance) && Object.op_Implicit((Object)(object)clientInstance.targetBody) && (Object)(object)clientInstance.targetBody.master == (Object)(object)val2)
				{
					clientInstance._stress01 = Mathf.Clamp01(value);
				}
			}
		}

		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static hook_Awake <>9__21_0;

			internal void <Init>b__21_0(orig_Awake orig, HUD self)
			{
				orig.Invoke(self);
				ClientInstance = ((Component)self).GetComponent<HealthBarController>() ?? ((Component)self).gameObject.AddComponent<HealthBarController>();
			}
		}

		public HUD hud;

		public CharacterBody targetBody;

		public static HealthBarController ClientInstance;

		private HealthBarView _view;

		private CharacterMaster _lockedMaster;

		private float _nextReattachPoll;

		private const float UiUpdateInterval = 0.1f;

		private float _nextUiUpdateTime;

		private int _lastHP = -1;

		private int _lastMax = -1;

		private float _lastFracShown = -1f;

		public float HealthSmoothSpeed = 16f;

		public float StressSmoothSpeed = 3f;

		private float _hpFracTarget;

		private float _hpFracDisplay = -1f;

		private float _stress01;

		private float _stressDisplay;

		public float ScrollSensitivity = 0.05f;

		private float _lastSentStress = -1f;

		private float _nextSendAt;

		private float _pendingScrollDelta;

		public static void Init()
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Expected O, but got Unknown
			object obj = <>c.<>9__21_0;
			if (obj == null)
			{
				hook_Awake val = delegate(orig_Awake orig, HUD self)
				{
					orig.Invoke(self);
					ClientInstance = ((Component)self).GetComponent<HealthBarController>() ?? ((Component)self).gameObject.AddComponent<HealthBarController>();
				};
				<>c.<>9__21_0 = val;
				obj = (object)val;
			}
			HUD.Awake += (hook_Awake)obj;
			NetworkingAPI.RegisterMessageType<StressMsg>();
		}

		private void Awake()
		{
			hud = ((Component)this).GetComponent<HUD>();
			_view = ((Component)hud).GetComponent<HealthBarView>();
			if (!Object.op_Implicit((Object)(object)_view))
			{
				_view = ((Component)hud).gameObject.AddComponent<HealthBarView>();
			}
			_view.Build(hud.mainContainer.transform);
			_view.SetVisible(v: false);
			EscortState.OnEscortAssigned += OnEscortAssigned;
			CharacterBody.onBodyStartGlobal += OnAnyBodyStart;
		}

		private void OnDestroy()
		{
			EscortState.OnEscortAssigned -= OnEscortAssigned;
			CharacterBody.onBodyStartGlobal -= OnAnyBodyStart;
		}

		private void OnEscortAssigned(CharacterMaster m)
		{
			_lockedMaster = m;
			TryAttachToCurrentBody();
		}

		private void OnAnyBodyStart(CharacterBody b)
		{
			if (!((Object)(object)_lockedMaster == (Object)null) && !((Object)(object)b == (Object)null))
			{
				CharacterMaster master = b.master;
				if (!((Object)(object)master != (Object)(object)_lockedMaster) && IsPlayerOwnedMaster(master))
				{
					SetTarget(b);
				}
			}
		}

		private static bool IsPlayerOwnedMaster(CharacterMaster m)
		{
			PlayerCharacterMasterController val = (Object.op_Implicit((Object)(object)m) ? m.playerCharacterMasterController : null);
			if ((Object)(object)val != (Object)null)
			{
				return (Object)(object)val.networkUser != (Object)null;
			}
			return false;
		}

		private void TryAttachToCurrentBody()
		{
			CharacterBody target = (Object.op_Implicit((Object)(object)_lockedMaster) ? _lockedMaster.GetBody() : null);
			SetTarget(target);
		}

		public void SetTarget(CharacterBody body)
		{
			targetBody = body;
			_view.SetVisible((Object)(object)body != (Object)null);
			if (Object.op_Implicit((Object)(object)body))
			{
				HealthComponent healthComponent = body.healthComponent;
				float num = (_hpFracDisplay = (_hpFracTarget = ((Object.op_Implicit((Object)(object)healthComponent) && healthComponent.fullCombinedHealth > 0f) ? (healthComponent.combinedHealth / healthComponent.fullCombinedHealth) : 0f)));
				_view.SetFillFraction(num);
				_lastFracShown = num;
				int num2 = Mathf.CeilToInt(Object.op_Implicit((Object)(object)healthComponent) ? healthComponent.combinedHealth : 0f);
				int num3 = Mathf.CeilToInt(Object.op_Implicit((Object)(object)healthComponent) ? healthComponent.fullCombinedHealth : 0f);
				_view.SetLabel($"{num2} / {num3}");
			}
		}

		private void Update()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			float num = 0f;
			float y = Input.mouseScrollDelta.y;
			if (Mathf.Abs(y) > 1E-05f)
			{
				num = y;
			}
			else
			{
				float axis = Input.GetAxis("Mouse ScrollWheel");
				if (Mathf.Abs(axis) > 1E-05f)
				{
					num = axis;
				}
			}
			if (Mathf.Abs(num) > 1E-05f)
			{
				_pendingScrollDelta += num;
			}
		}

		private void LateUpdate()
		{
			//IL_02dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)targetBody) || !Object.op_Implicit((Object)(object)targetBody.healthComponent))
			{
				_view.SetVisible(v: false);
				return;
			}
			_view.SetVisible(v: true);
			if (TargetControlledByLocalUser())
			{
				float pendingScrollDelta = _pendingScrollDelta;
				_pendingScrollDelta = 0f;
				if (Mathf.Abs(pendingScrollDelta) > 1E-05f)
				{
					float num = Mathf.Clamp01(_stress01 + pendingScrollDelta * ScrollSensitivity);
					if (!Mathf.Approximately(num, _stress01))
					{
						_stress01 = num;
						float unscaledTime = Time.unscaledTime;
						if (unscaledTime >= _nextSendAt && Mathf.Abs(num - _lastSentStress) >= 0.01f)
						{
							_lastSentStress = num;
							_nextSendAt = unscaledTime + 0.05f;
							CharacterMaster master = targetBody.master;
							StressMsg stressMsg = default(StressMsg);
							NetworkInstanceId netId = ((NetworkBehaviour)master).netId;
							stressMsg.masterId = ((NetworkInstanceId)(ref netId)).Value;
							stressMsg.value = num;
							NetMessageExtensions.Send((INetMessage)(object)stressMsg, (NetworkDestination)2);
						}
					}
				}
			}
			if (Time.unscaledTime >= _nextUiUpdateTime)
			{
				_nextUiUpdateTime = Time.unscaledTime + 0.1f;
				HealthComponent healthComponent = targetBody.healthComponent;
				int num2 = Mathf.CeilToInt(healthComponent.combinedHealth);
				int num3 = Mathf.CeilToInt(healthComponent.fullCombinedHealth);
				float num4 = (((float)num3 > 0f) ? (healthComponent.combinedHealth / healthComponent.fullCombinedHealth) : 0f);
				if (!Mathf.Approximately(num4, _lastFracShown))
				{
					_hpFracTarget = num4;
					_lastFracShown = num4;
				}
				if (num2 != _lastHP || num3 != _lastMax)
				{
					_view.SetLabel($"{num2} / {num3}");
					_lastHP = num2;
					_lastMax = num3;
				}
			}
			if (_hpFracDisplay < 0f)
			{
				_hpFracDisplay = _hpFracTarget;
			}
			float num5 = 1f - Mathf.Exp((0f - HealthSmoothSpeed) * Time.unscaledDeltaTime);
			_hpFracDisplay = Mathf.Lerp(_hpFracDisplay, _hpFracTarget, num5);
			_view.SetFillFraction(_hpFracDisplay);
			float num6 = 1f - Mathf.Exp((0f - StressSmoothSpeed) * Time.unscaledDeltaTime);
			_stressDisplay = Mathf.Lerp(_stressDisplay, _stress01, num6);
			_view.SetStressFraction(_stressDisplay);
			if (_lastFracShown <= _view.LowHealthThreshold)
			{
				float num7 = Mathf.PingPong(Time.unscaledTime * 6f, 1f);
				_view.SetFillColor(Color.Lerp(_view.FlashColorA, _view.FlashColorB, num7));
			}
			else
			{
				_view.SetFillColor(_view.FillColor);
			}
			if (Object.op_Implicit((Object)(object)_lockedMaster) && !Object.op_Implicit((Object)(object)targetBody) && Time.unscaledTime >= _nextReattachPoll)
			{
				_nextReattachPoll = Time.unscaledTime + 0.25f;
				if (IsPlayerOwnedMaster(_lockedMaster))
				{
					SetTarget(_lockedMaster.GetBody());
				}
			}
		}

		private bool TargetControlledByLocalUser()
		{
			CharacterMaster val = (Object.op_Implicit((Object)(object)targetBody) ? targetBody.master : null);
			PlayerCharacterMasterController val2 = (Object.op_Implicit((Object)(object)val) ? val.playerCharacterMasterController : null);
			NetworkUser val3 = (Object.op_Implicit((Object)(object)val2) ? val2.networkUser : null);
			if (!Object.op_Implicit((Object)(object)val3))
			{
				return false;
			}
			foreach (NetworkUser readOnlyLocalPlayers in NetworkUser.readOnlyLocalPlayersList)
			{
				if ((Object)(object)readOnlyLocalPlayers == (Object)(object)val3)
				{
					return true;
				}
			}
			return false;
		}
	}
	public static class ItemRules
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static hook_Init <>9__0_0;

			internal void <Init>b__0_0(orig_Init orig)
			{
				orig.Invoke();
				ItemDef extraLifeVoid = Items.ExtraLifeVoid;
				if (Config.RemoveLarva.Value && (Object)(object)extraLifeVoid != (Object)null)
				{
					extraLifeVoid.tier = (ItemTier)5;
				}
			}
		}

		public static void Init()
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Expected O, but got Unknown
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Expected O, but got Unknown
			object obj = <>c.<>9__0_0;
			if (obj == null)
			{
				hook_Init val = delegate(orig_Init orig)
				{
					orig.Invoke();
					ItemDef extraLifeVoid = Items.ExtraLifeVoid;
					if (Config.RemoveLarva.Value && (Object)(object)extraLifeVoid != (Object)null)
					{
						extraLifeVoid.tier = (ItemTier)5;
					}
				};
				<>c.<>9__0_0 = val;
				obj = (object)val;
			}
			ItemCatalog.Init += (hook_Init)obj;
			CharacterMaster.OnBodyDeath += new hook_OnBodyDeath(OnBodyDeathReplace);
		}

		private static void OnBodyDeathReplace(orig_OnBodyDeath orig, CharacterMaster self, CharacterBody body)
		{
			if (!NetworkServer.active || (Object)(object)self == (Object)null)
			{
				orig.Invoke(self, body);
				return;
			}
			if (!((Object)(object)self.playerCharacterMasterController != (Object)null))
			{
				orig.Invoke(self, body);
				return;
			}
			Inventory inventory = self.inventory;
			if ((Object)(object)inventory == (Object)null)
			{
				orig.Invoke(self, body);
				return;
			}
			int itemCount = inventory.GetItemCount(Items.ExtraLife);
			int itemCount2 = inventory.GetItemCount(Items.ExtraLifeVoid);
			if (itemCount > 0)
			{
				inventory.GiveItem(Items.ExtraLife, -itemCount);
			}
			if (itemCount2 > 0)
			{
				inventory.GiveItem(Items.ExtraLifeVoid, -itemCount2);
			}
			try
			{
				orig.Invoke(self, body);
			}
			finally
			{
				if (itemCount > 0)
				{
					inventory.GiveItem(Items.ExtraLife, itemCount);
				}
				if (itemCount2 > 0)
				{
					inventory.GiveItem(Items.ExtraLifeVoid, itemCount2);
				}
			}
		}
	}
	public static class RespawnSystem
	{
		private static TeleporterInteraction _teleporter;

		private static HoldoutZoneController _hz;

		private const float kChargedEpsilon = 0.999f;

		private static float _revivePunishmentAccumulated = 0f;

		private static readonly Dictionary<CharacterMaster, float> pendingRespawnTimes = new Dictionary<CharacterMaster, float>();

		public static void Init()
		{
			RoR2Application.onFixedUpdate += OnFixedUpdate;
			GlobalEventManager.onCharacterDeathGlobal += OnCharacterDeath;
			Run.onRunStartGlobal += delegate
			{
				FindTeleporterRefsDelayed();
			};
			Stage.onServerStageBegin += delegate
			{
				FindTeleporterRefsDelayed();
			};
			Stage.onServerStageBegin += delegate
			{
				_revivePunishmentAccumulated = 0f;
			};
			RoR2Application.onUpdate += UpdateFlushWhenFinished;
			Run.onRunStartGlobal += OnRunStart;
			Run.onRunDestroyGlobal += OnRunDestroy;
		}

		private static void OnRunStart(Run run)
		{
			pendingRespawnTimes.Clear();
			_teleporter = null;
			_hz = null;
			_revivePunishmentAccumulated = 0f;
		}

		private static void OnRunDestroy(Run run)
		{
			pendingRespawnTimes.Clear();
			_teleporter = null;
			_hz = null;
			_revivePunishmentAccumulated = 0f;
		}

		private static void FindTeleporterRefsDelayed()
		{
			if (NetworkServer.active)
			{
				_teleporter = Object.FindObjectOfType<TeleporterInteraction>();
				_hz = (Object.op_Implicit((Object)(object)_teleporter) ? _teleporter.holdoutZoneController : null);
			}
		}

		private static bool TeleporterFinished()
		{
			if (!Object.op_Implicit((Object)(object)_hz))
			{
				return false;
			}
			return Mathf.Clamp01(_hz.charge) >= 0.999f;
		}

		private static bool TeleporterCharging()
		{
			if (!Object.op_Implicit((Object)(object)_teleporter) || !Object.op_Implicit((Object)(object)_hz))
			{
				return false;
			}
			float num = Mathf.Clamp01(_hz.charge);
			if (num > 0f)
			{
				return num < 0.999f;
			}
			return false;
		}

		private static void OnCharacterDeath(DamageReport report)
		{
			if (!NetworkServer.active)
			{
				return;
			}
			CharacterBody val = report?.victimBody;
			if (!Object.op_Implicit((Object)(object)val))
			{
				return;
			}
			CharacterMaster master = val.master;
			if (!Object.op_Implicit((Object)(object)master))
			{
				return;
			}
			if (Object.op_Implicit((Object)(object)EscortState.Master) && (Object)(object)master == (Object)(object)EscortState.Master)
			{
				CameraSystem.ForceSpectateAll(val);
				KillAllPlayers();
			}
			else
			{
				if ((Object)(object)master.playerCharacterMasterController == (Object)null)
				{
					return;
				}
				if (!TeleporterFinished())
				{
					float num = Mathf.Max(0f, Config.ReviveSecondsPunishment.Value);
					if (num > 0f)
					{
						_revivePunishmentAccumulated += num;
					}
				}
				bool flag = TeleporterCharging();
				float num2;
				if (TeleporterFinished())
				{
					num2 = 0f;
				}
				else if (Config.BlockDuringTele.Value && flag)
				{
					num2 = float.PositiveInfinity;
				}
				else
				{
					float num3 = Config.BaseRespawnSeconds.Value + _revivePunishmentAccumulated;
					num2 = (flag ? (num3 * Config.DuringTeleRespawnMulti.Value) : num3);
				}
				if (Config.DisableDioRevive_UseBonus.Value && num2 > 0f && !float.IsInfinity(num2))
				{
					Inventory inventory = val.inventory;
					int num4 = (Object.op_Implicit((Object)(object)inventory) ? inventory.GetItemCount(Items.ExtraLife) : 0);
					if (num4 > 0)
					{
						float num5 = Mathf.Max(0f, Config.DioHyperbolicPerStack.Value);
						num2 /= 1f + num5 * (float)num4;
					}
				}
				float value = Run.instance.time + num2;
				pendingRespawnTimes[master] = value;
			}
		}

		private static void OnFixedUpdate()
		{
			if (!NetworkServer.active || pendingRespawnTimes.Count == 0)
			{
				return;
			}
			float num = (Object.op_Implicit((Object)(object)Run.instance) ? Run.instance.time : 0f);
			List<CharacterMaster> list = new List<CharacterMaster>();
			foreach (KeyValuePair<CharacterMaster, float> pendingRespawnTime in pendingRespawnTimes)
			{
				CharacterMaster key = pendingRespawnTime.Key;
				if (Object.op_Implicit((Object)(object)key))
				{
					float value = pendingRespawnTime.Value;
					if (float.IsInfinity(value) && !TeleporterCharging())
					{
						list.Add(key);
					}
					else if (!float.IsInfinity(value) && num >= value)
					{
						list.Add(key);
					}
				}
			}
			foreach (CharacterMaster item in list)
			{
				TryRespawn(item);
				pendingRespawnTimes.Remove(item);
			}
		}

		private static Vector3 RandomHorizontalUnit()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: 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_0037: 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)
			Vector2 insideUnitCircle = Random.insideUnitCircle;
			if (((Vector2)(ref insideUnitCircle)).sqrMagnitude < 1E-06f)
			{
				((Vector2)(ref insideUnitCircle))..ctor(1f, 0f);
			}
			((Vector2)(ref insideUnitCircle)).Normalize();
			return new Vector3(insideUnitCircle.x, 0f, insideUnitCircle.y);
		}

		private static void TryRespawn(CharacterMaster master)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: 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)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: 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_009e: 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_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0143: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_0169: 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_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_017c: 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_018c: Expected O, but got Unknown
			if (!Object.op_Implicit((Object)(object)master) || (Config.BlockDuringTele.Value && TeleporterCharging()))
			{
				return;
			}
			Vector3 deathFootPosition = master.deathFootPosition;
			if (Config.RespawnNearEscort.Value && Object.op_Implicit((Object)(object)EscortState.Master) && Object.op_Implicit((Object)(object)EscortState.Master.GetBody()))
			{
				CharacterBody body = EscortState.Master.GetBody();
				Vector3 val = body.corePosition;
				if ((Object)(object)body != (Object)null)
				{
					Vector3 val2 = RandomHorizontalUnit() * 24f;
					val += val2;
				}
				deathFootPosition = TeleportHelper.FindSafeTeleportDestination(val, master.bodyPrefab.GetComponent<CharacterBody>(), RoR2Application.rng).GetValueOrDefault(val);
			}
			else
			{
				deathFootPosition = (Vector3)(((??)TeleportHelper.FindSafeTeleportDestination(master.deathFootPosition, master.bodyPrefab.GetComponent<CharacterBody>(), RoR2Application.rng)) ?? master.deathFootPosition);
			}
			master.Respawn(deathFootPosition, Quaternion.Euler(0f, Random.Range(0f, 360f), 0f), true);
			master.GetBody().AddTimedBuff(Buffs.Immune, 3f);
			GameObject val3 = LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/HippoRezEffect");
			if (Object.op_Implicit((Object)(object)master.GetBody()))
			{
				EntityStateMachine[] components = ((Component)master.GetBody()).GetComponents<EntityStateMachine>();
				foreach (EntityStateMachine obj in components)
				{
					obj.initialStateType = obj.mainStateType;
				}
				if (Object.op_Implicit((Object)(object)val3))
				{
					EffectManager.SpawnEffect(val3, new EffectData
					{
						origin = deathFootPosition,
						rotation = ((Component)master.GetBody()).transform.rotation
					}, true);
				}
			}
		}

		private static void UpdateFlushWhenFinished()
		{
			if (!NetworkServer.active || !TeleporterFinished())
			{
				return;
			}
			foreach (CharacterMaster item in pendingRespawnTimes.Keys.ToList())
			{
				if (float.IsInfinity(pendingRespawnTimes[item]))
				{
					TryRespawn(item);
					pendingRespawnTimes.Remove(item);
				}
			}
		}

		private static void KillAllPlayers()
		{
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			foreach (CharacterBody readOnlyInstances in CharacterBody.readOnlyInstancesList)
			{
				if (Object.op_Implicit((Object)(object)readOnlyInstances) && Object.op_Implicit((Object)(object)readOnlyInstances.healthComponent) && readOnlyInstances.healthComponent.alive && Object.op_Implicit((Object)(object)readOnlyInstances.teamComponent) && (int)readOnlyInstances.teamComponent.teamIndex == 1)
				{
					readOnlyInstances.healthComponent.Suicide(((Component)readOnlyInstances).gameObject, (GameObject)null, DamageTypeCombo.op_Implicit((DamageType)0));
				}
			}
		}
	}
	public static class TeleporterSystem
	{
		private static TeleporterInteraction _teleporter;

		private static HoldoutZoneController _hz;

		private const float kChargedEpsilon = 0.999f;

		private static float _lastCharge;

		public static void Init()
		{
			Run.onRunStartGlobal += delegate
			{
				Reset();
			};
			Run.onRunDestroyGlobal += delegate
			{
				Reset();
			};
			Stage.onServerStageBegin += delegate
			{
				FindTeleporterRefsDelayed();
			};
			RoR2Application.onFixedUpdate += FixedTick;
		}

		private static void Reset()
		{
			_teleporter = null;
			_hz = null;
			_lastCharge = 0f;
		}

		private static void FindTeleporterRefsDelayed()
		{
			if (NetworkServer.active)
			{
				_teleporter = Object.FindObjectOfType<TeleporterInteraction>();
				_hz = (Object.op_Implicit((Object)(object)_teleporter) ? _teleporter.holdoutZoneController : null);
				_lastCharge = 0f;
			}
		}

		public static bool IsCharging()
		{
			if (!Object.op_Implicit((Object)(object)_teleporter) || !Object.op_Implicit((Object)(object)_hz))
			{
				return false;
			}
			float num = Mathf.Clamp01(_hz.charge);
			if (num > 0f)
			{
				return num < 0.999f;
			}
			return false;
		}

		public static bool IsFinished()
		{
			if (!Object.op_Implicit((Object)(object)_hz))
			{
				return false;
			}
			return Mathf.Clamp01(_hz.charge) >= 0.999f;
		}

		private static void FixedTick()
		{
			if (!((Object)(object)_hz == (Object)null))
			{
				_lastCharge = Mathf.Clamp01(_hz.charge);
			}
		}
	}
}
namespace MonsterEscort.Core
{
	public static class EscortState
	{
		public static CharacterMaster Master { get; private set; }

		public static CharacterBody Body
		{
			get
			{
				if (!Object.op_Implicit((Object)(object)Master) || !Object.op_Implicit((Object)(object)Master.GetBody()))
				{
					return null;
				}
				return Master.GetBody();
			}
		}

		public static event Action<CharacterMaster> OnEscortAssigned;

		public static void Reset()
		{
			Master = null;
		}

		public static void Assign(CharacterMaster master)
		{
			if (Object.op_Implicit((Object)(object)master) && !((Object)(object)master == (Object)(object)Master))
			{
				Master = master;
				EscortState.OnEscortAssigned?.Invoke(Master);
			}
		}

		public static void EnsureAssignedOnceFromScene()
		{
			if (Object.op_Implicit((Object)(object)Master) || !NetworkServer.active || (Object)(object)Run.instance == (Object)null)
			{
				return;
			}
			foreach (NetworkUser readOnlyInstances in NetworkUser.readOnlyInstancesList)
			{
				CharacterMaster val = ((readOnlyInstances != null) ? readOnlyInstances.master : null);
				if (!Object.op_Implicit((Object)(object)val) || !Object.op_Implicit((Object)(object)val.GetBody()))
				{
					return;
				}
			}
			List<CharacterMaster> list = new List<CharacterMaster>();
			foreach (CharacterMaster readOnlyInstances2 in CharacterMaster.readOnlyInstancesList)
			{
				if ((Object)(object)readOnlyInstances2 == (Object)null || (Object)(object)readOnlyInstances2.playerCharacterMasterController == (Object)null)
				{
					continue;
				}
				CharacterBody body = readOnlyInstances2.GetBody();
				if (Object.op_Implicit((Object)(object)body))
				{
					string bodyPrefabName = GetBodyPrefabName(body);
					if (!string.IsNullOrEmpty(bodyPrefabName) && bodyPrefabName.StartsWith("MonsterMash_", StringComparison.OrdinalIgnoreCase) && bodyPrefabName.IndexOf("Drone", StringComparison.OrdinalIgnoreCase) < 0)
					{
						list.Add(readOnlyInstances2);
					}
				}
			}
			if (list.Count == 1)
			{
				Assign(list[0]);
			}
		}

		private static string GetBodyPrefabName(CharacterBody body)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Invalid comparison between Unknown and I4
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			string text = null;
			if (Object.op_Implicit((Object)(object)body) && (int)body.bodyIndex != -1)
			{
				GameObject bodyPrefab = BodyCatalog.GetBodyPrefab(body.bodyIndex);
				if (Object.op_Implicit((Object)(object)bodyPrefab))
				{
					text = ((Object)bodyPrefab).name;
				}
			}
			if (string.IsNullOrEmpty(text) && Object.op_Implicit((Object)(object)body))
			{
				text = ((Object)((Component)body).gameObject).name ?? "";
				if (text.EndsWith("(Clone)"))
				{
					text = text.Substring(0, text.Length - "(Clone)".Length);
				}
			}
			return text ?? "";
		}
	}
	public static class GameEvents
	{
		public static event Action OnTeleporterChargeStart;

		public static event Action<float> OnTeleporterCharge;

		public static event Action OnTeleporterFinished;

		internal static void RaiseTeleporterStart()
		{
			GameEvents.OnTeleporterChargeStart?.Invoke();
		}

		internal static void RaiseTeleporter(float t)
		{
			GameEvents.OnTeleporterCharge?.Invoke(t);
		}

		internal static void RaiseTeleporterDone()
		{
			GameEvents.OnTeleporterFinished?.Invoke();
		}
	}
	[BepInPlugin("thebugreport.MonsterEscort", "MonsterEscort", "1.0.0")]
	public sealed class Plugin : BaseUnityPlugin
	{
		private void Awake()
		{
			Config.Bind(((BaseUnityPlugin)this).Config);
			ItemRules.Init();
			TeleporterSystem.Init();
			RespawnSystem.Init();
			HealthBarController.Init();
			RoR2Application.onUpdate += delegate
			{
				EscortState.EnsureAssignedOnceFromScene();
			};
			Run.onRunStartGlobal += delegate
			{
				EscortState.Reset();
			};
			Run.onRunDestroyGlobal += delegate
			{
				EscortState.Reset();
			};
		}
	}
	public static class Config
	{
		public static ConfigEntry<float> BaseRespawnSeconds;

		public static ConfigEntry<float> ReviveSecondsPunishment;

		public static ConfigEntry<bool> BlockDuringTele;

		public static ConfigEntry<float> DuringTeleRespawnMulti;

		public static ConfigEntry<bool> RespawnNearEscort;

		public static ConfigEntry<float> EscortExclusionRadius;

		public static ConfigEntry<bool> CurseEscortOnRespawn;

		public static ConfigEntry<bool> CursePlayerOnRespawn;

		public static ConfigEntry<float> CurseFraction;

		public static ConfigEntry<bool> DebuffEscortOnRespawn;

		public static ConfigEntry<bool> DebuffPlayerOnRespawn;

		public static ConfigEntry<float> DebuffEffectDuration;

		public static ConfigEntry<bool> ApplyAllDebuffs;

		public static ConfigEntry<string> DebuffIDs;

		public static ConfigEntry<bool> AddCreditsOnRespawn;

		public static ConfigEntry<int> CreditsPerRespawnPerStage;

		public static ConfigEntry<bool> DisableDioRevive_UseBonus;

		public static ConfigEntry<float> DioHyperbolicPerStack;

		public static ConfigEntry<bool> RemoveLarva;

		public static void Bind(ConfigFile cfg)
		{
			BaseRespawnSeconds = cfg.Bind<float>("Respawn", "BaseRespawnSeconds", 20f, "Default respawn cooldown (seconds).");
			ReviveSecondsPunishment = cfg.Bind<float>("Respawn", "ReviveSecondsPunishment", 5f, "Additional respawn cooldown per revive used (applies to team as a whole) (seconds).");
			BlockDuringTele = cfg.Bind<bool>("Respawn", "BlockDuringTeleporterCharge", true, "If true, block respawns while teleporter is charging; respawn all when charged.");
			DuringTeleRespawnMulti = cfg.Bind<float>("Respawn", "DuringTeleporterRespawnMulti", 2f, "If not blocking during charge, multiply the respawn time by this amount.");
			RespawnNearEscort = cfg.Bind<bool>("Respawn", "RespawnNearEscort", false, "If true, respawn near escort; otherwise near death location.");
			EscortExclusionRadius = cfg.Bind<float>("Respawn", "EscortExclusionRadius", 6f, "Minimum distance from the escort when respawning near it.");
			CurseEscortOnRespawn = cfg.Bind<bool>("Debuff", "CurseEscortOnRespawn", false, "If true, curse the escort on player respawn.");
			CursePlayerOnRespawn = cfg.Bind<bool>("Debuff", "CursePlayerOnRespawn", false, "If true, curse the player on respawn.");
			CurseFraction = cfg.Bind<float>("Debuff", "CurseFraction", 0.08f, "Fraction of max health to apply as curse on respawn (0.0 to 1.0).");
			DebuffEscortOnRespawn = cfg.Bind<bool>("Debuff", "DebuffEscortOnRespawn", false, "If true, apply debuff effect to escort on player respawn.");
			DebuffPlayerOnRespawn = cfg.Bind<bool>("Debuff", "DebuffPlayerOnRespawn", true, "If true, apply debuff effect to player on respawn.");
			DebuffEffectDuration = cfg.Bind<float>("Debuff", "DebuffEffectDuration", 12f, "Duration of debuff effect applied on respawn (seconds).");
			ApplyAllDebuffs = cfg.Bind<bool>("Debuff", "ApplyAllDebuffs", false, "If true, apply all debuffs listed in DebuffEffectIDs; otherwise pick a random one from the list below.");
			DebuffIDs = cfg.Bind<string>("Debuff", "DebuffEffectID", "Weak, Slow50", "Internal effect name of debuff/buff to apply on respawn (eg. 'Bleeding', 'Slow50', 'Weak', etc.).");
			AddCreditsOnRespawn = cfg.Bind<bool>("Debuff", "AddCreditsOnRespawn", true, "If true, add credits to monster director on respawn.");
			CreditsPerRespawnPerStage = cfg.Bind<int>("Debuff", "CreditsPerRespawnPerStage", 50, "Amount of credits to add per respawn, per stage.");
			DisableDioRevive_UseBonus = cfg.Bind<bool>("Items", "DisableDioAndUseHyperbolicBonus", true, "Stop Dio revives; use hyperbolic respawn-time reduction.");
			DioHyperbolicPerStack = cfg.Bind<float>("Items", "HyperbolicPerStack", 0.25f, "Hyperbolic per-stack: effective = base / (1 + v*stacks).");
			RemoveLarva = cfg.Bind<bool>("Items", "RemovePluripotentLarva", true, "Remove ExtraLifeVoid (Pluripotent Larva) from droptables.");
		}
	}
}