Decompiled source of OverheadStamina v1.0.0

plugins\patchnote.OverheadStamina.dll

Decompiled a week ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using TMPro;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
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("patchnote.OverheadStamina")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+1c6e44c74b8f718db966f046aba9b3244536d6a4")]
[assembly: AssemblyProduct("patchnote.OverheadStamina")]
[assembly: AssemblyTitle("patchnote.OverheadStamina")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

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

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

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

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace OverheadStamina
{
	public static class OverheadStaminaAPI
	{
		public static bool FarSightDisabled => Plugin.FarSightDisabled;

		public static void DisableFarSight(string requesterId)
		{
			Plugin.SetFarSightDisabled(requesterId, disabled: true);
		}

		public static void EnableFarSight(string requesterId)
		{
			Plugin.SetFarSightDisabled(requesterId, disabled: false);
		}
	}
	internal static class CompatibilityPluginGuids
	{
		internal const string Hunter = "com.github.BloopTankStudios.PEAK-Hunter";
	}
	[BepInPlugin("patchnote.overheadstamina", "Overhead Stamina", "1.0.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public sealed class Plugin : BaseUnityPlugin
	{
		[HarmonyPatch(typeof(UIPlayerNames), "UpdateName")]
		private static class UIPlayerNamesUpdateNamePatch
		{
			private static void Prefix(UIPlayerNames __instance, int index, ref bool visible)
			{
				if (!visible && __instance.playerNameText != null && index >= 0 && index < __instance.playerNameText.Length)
				{
					PlayerName val = __instance.playerNameText[index];
					Character localCharacter = Character.localCharacter;
					Character val2 = (((Object)(object)val != (Object)null && (Object)(object)val.characterInteractable != (Object)null) ? val.characterInteractable.character : null);
					if ((Object)(object)localCharacter != (Object)null && (Object)(object)val2 != (Object)null && (Object)(object)val2 != (Object)(object)localCharacter && OverheadStaminaNameplate.IsVisibleForMod(localCharacter, val2))
					{
						visible = true;
					}
				}
			}

			private static void Postfix(UIPlayerNames __instance, int index, bool visible)
			{
				if (__instance.playerNameText == null || index < 0 || index >= __instance.playerNameText.Length)
				{
					return;
				}
				PlayerName val = __instance.playerNameText[index];
				if (!((Object)(object)val == (Object)null))
				{
					OverheadStaminaNameplate overheadStaminaNameplate = ((Component)val).GetComponent<OverheadStaminaNameplate>();
					if ((Object)(object)overheadStaminaNameplate == (Object)null)
					{
						overheadStaminaNameplate = ((Component)val).gameObject.AddComponent<OverheadStaminaNameplate>();
					}
					overheadStaminaNameplate.Refresh(val, visible);
				}
			}
		}

		[HarmonyPatch(typeof(UIPlayerNames), "DisableName")]
		private static class UIPlayerNamesDisableNamePatch
		{
			private static void Prefix(UIPlayerNames __instance, int index)
			{
				if (__instance.playerNameText != null && index >= 0 && index < __instance.playerNameText.Length)
				{
					PlayerName val = __instance.playerNameText[index];
					OverheadStaminaNameplate overheadStaminaNameplate = default(OverheadStaminaNameplate);
					if ((Object)(object)val != (Object)null && ((Component)val).TryGetComponent<OverheadStaminaNameplate>(ref overheadStaminaNameplate))
					{
						overheadStaminaNameplate.Hide();
					}
				}
			}
		}

		[HarmonyPatch(typeof(GUIManager), "LateUpdate")]
		private static class GUIManagerLateUpdatePatch
		{
			private static void Postfix(GUIManager __instance)
			{
				//IL_0005: 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)
				int num;
				if ((int)DistanceOverlayKeyboardKey.Value != 0 && !IsInputBlocked())
				{
					num = (IsKeyboardKeyPressed(DistanceOverlayKeyboardKey.Value) ? 1 : 0);
					if (num != 0 && !s_distanceOverlayKeyWasDown)
					{
						DistanceOverlayEnabled = !DistanceOverlayEnabled;
						OverheadStaminaNameplate.RefreshAllNameText(__instance.playerNames);
					}
				}
				else
				{
					num = 0;
				}
				s_distanceOverlayKeyWasDown = (byte)num != 0;
			}

			private static bool IsKeyboardKeyPressed(KeyCode key)
			{
				//IL_003c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0009: Unknown result type (might be due to invalid IL or missing references)
				//IL_000c: Invalid comparison between Unknown and I4
				//IL_000e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0011: Invalid comparison between Unknown and I4
				//IL_0013: Unknown result type (might be due to invalid IL or missing references)
				//IL_0016: Invalid comparison between Unknown and I4
				Keyboard current = Keyboard.current;
				if (current != null)
				{
					if ((int)key == 103)
					{
						return ((ButtonControl)current.gKey).isPressed;
					}
					if ((int)key == 116)
					{
						return ((ButtonControl)current.tKey).isPressed;
					}
					if ((int)key == 121)
					{
						return ((ButtonControl)current.yKey).isPressed;
					}
				}
				return TryGetLegacyKey(key);
			}

			private static bool TryGetLegacyKey(KeyCode key)
			{
				//IL_0000: Unknown result type (might be due to invalid IL or missing references)
				try
				{
					return Input.GetKey(key);
				}
				catch
				{
					return false;
				}
			}

			private static bool IsInputBlocked()
			{
				try
				{
					return (Object)(object)GUIManager.instance != (Object)null && (GUIManager.instance.windowBlockingInput || GUIManager.instance.wheelActive);
				}
				catch
				{
					return false;
				}
			}
		}

		internal const string PluginGuid = "patchnote.overheadstamina";

		internal const string PluginName = "Overhead Stamina";

		internal const string PluginVersion = "1.0.0";

		private Harmony? _harmony;

		private static readonly HashSet<string> s_farSightDisableRequests = new HashSet<string>();

		internal const float BaseBarWidth = 118f;

		internal const float BaseBarHeight = 12f;

		internal const float BaseExtraStaminaHeight = 3f;

		internal const float BaseExtraStaminaGap = 2f;

		internal const float BaseMinSegmentWidth = 12f;

		internal const float NameTextClearance = 28f;

		internal const float DistanceOverlayMaxDistance = 2000f;

		private static bool s_distanceOverlayKeyWasDown;

		internal static ConfigEntry<float> MaxDistance { get; private set; } = null;


		internal static ConfigEntry<float> BarScale { get; private set; } = null;


		internal static ConfigEntry<KeyCode> DistanceOverlayKeyboardKey { get; private set; } = null;


		internal static bool DistanceOverlayEnabled { get; private set; }

		internal static bool FarSightDisabled => s_farSightDisableRequests.Count > 0;

		private void Awake()
		{
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Expected O, but got Unknown
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Expected O, but got Unknown
			MaxDistance = ((BaseUnityPlugin)this).Config.Bind<float>("General", "MaxDistance", 18f, "Maximum world-space distance at which another player's stamina bar is shown above their name.");
			BarScale = ((BaseUnityPlugin)this).Config.Bind<float>("General", "BarScale", 1.5f, new ConfigDescription("Scale multiplier for the stamina bar shown above player names.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.25f, 3f), Array.Empty<object>()));
			DistanceOverlayKeyboardKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("General", "DistanceOverlayKeyboardKey", (KeyCode)96, "Keyboard key used to toggle the distance debug overlay. Set to None to disable.");
			EnableHunterCompatibilityIfLoaded();
			_harmony = new Harmony("patchnote.overheadstamina");
			_harmony.PatchAll(typeof(Plugin).Assembly);
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded Overhead Stamina 1.0.0.");
		}

		private void OnDestroy()
		{
			Harmony? harmony = _harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
		}

		internal static void SetFarSightDisabled(string requesterId, bool disabled)
		{
			if (string.IsNullOrWhiteSpace(requesterId))
			{
				throw new ArgumentException("A stable requester id is required.", "requesterId");
			}
			if (disabled)
			{
				s_farSightDisableRequests.Add(requesterId);
			}
			else
			{
				s_farSightDisableRequests.Remove(requesterId);
			}
		}

		private void EnableHunterCompatibilityIfLoaded()
		{
			if (Chainloader.PluginInfos.ContainsKey("com.github.BloopTankStudios.PEAK-Hunter"))
			{
				OverheadStaminaAPI.DisableFarSight("com.github.BloopTankStudios.PEAK-Hunter");
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Hunter detected; distance overlay range is limited to General.MaxDistance.");
			}
		}
	}
	internal sealed class OverheadStaminaNameplate : MonoBehaviour
	{
		private sealed class StatusSegment
		{
			internal GameObject GameObject;

			internal RectTransform RootRect;

			internal RectTransform Rect;

			internal STATUSTYPE StatusType;

			internal float TargetWidth;
		}

		private readonly List<StatusSegment> _segments = new List<StatusSegment>();

		private RectTransform? _container;

		private RectTransform? _staminaEmpty;

		private RectTransform? _staminaFill;

		private RectTransform? _extraStaminaFill;

		private Vector2 _staminaEmptySourceSize;

		private Vector2 _staminaFillSourceSize;

		private Vector2 _extraStaminaSourceSize;

		private StaminaBar? _sourceBar;

		private PlayerName? _playerName;

		internal void Refresh(PlayerName playerName, bool baseNameIsVisible)
		{
			_playerName = playerName;
			Character localCharacter = Character.localCharacter;
			Character val = (((Object)(object)playerName.characterInteractable != (Object)null) ? playerName.characterInteractable.character : null);
			if ((Object)(object)localCharacter == (Object)null || (Object)(object)val == (Object)null || (Object)(object)val == (Object)(object)localCharacter || !IsVisibleForMod(localCharacter, val))
			{
				Hide();
				return;
			}
			CharacterAfflictions afflictions = val.refs.afflictions;
			if ((Object)(object)afflictions == (Object)null)
			{
				Hide();
				return;
			}
			if ((Object)(object)playerName.text == (Object)null)
			{
				Hide();
				return;
			}
			UpdateNameText(playerName, val, localCharacter);
			if (!EnsureSegments(((TMP_Text)playerName.text).transform))
			{
				Hide();
				return;
			}
			if (!baseNameIsVisible)
			{
				((Component)playerName).gameObject.SetActive(true);
				if ((Object)(object)playerName.group != (Object)null)
				{
					playerName.group.alpha = Mathf.MoveTowards(playerName.group.alpha, 1f, Time.deltaTime * 5f);
				}
			}
			UpdateLayout(val, afflictions);
		}

		internal void Hide()
		{
			RestoreNameText(_playerName);
			if ((Object)(object)_container != (Object)null)
			{
				((Component)_container).gameObject.SetActive(false);
			}
		}

		internal static bool IsVisibleForMod(Character localCharacter, Character targetCharacter)
		{
			//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)
			//IL_0042: 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_0050: 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_006a: 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)
			if (GetDistanceToViewer(localCharacter, targetCharacter) > GetEffectiveMaxDistance())
			{
				return false;
			}
			Camera val = (((Object)(object)MainCamera.instance != (Object)null) ? ((Component)MainCamera.instance).GetComponent<Camera>() : null);
			if ((Object)(object)val == (Object)null)
			{
				return true;
			}
			Vector3 val2 = val.WorldToViewportPoint(targetCharacter.Center);
			if (val2.z > 0f && val2.x >= -0.1f && val2.x <= 1.1f && val2.y >= -0.1f)
			{
				return val2.y <= 1.1f;
			}
			return false;
		}

		internal static void RefreshAllNameText(UIPlayerNames? playerNames)
		{
			if ((Object)(object)playerNames == (Object)null || playerNames.playerNameText == null)
			{
				return;
			}
			Character localCharacter = Character.localCharacter;
			for (int i = 0; i < playerNames.playerNameText.Length; i++)
			{
				PlayerName val = playerNames.playerNameText[i];
				if (!((Object)(object)val == (Object)null) && !((Object)(object)val.text == (Object)null))
				{
					Character targetCharacter = (((Object)(object)val.characterInteractable != (Object)null) ? val.characterInteractable.character : null);
					UpdateNameText(val, targetCharacter, localCharacter);
				}
			}
		}

		private static float GetEffectiveMaxDistance()
		{
			float num = (Plugin.DistanceOverlayEnabled ? 2000f : Plugin.MaxDistance.Value);
			if (!Plugin.FarSightDisabled)
			{
				return num;
			}
			return Mathf.Min(num, Plugin.MaxDistance.Value);
		}

		private static float GetDistanceToViewer(Character localCharacter, Character targetCharacter)
		{
			//IL_0018: 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_001e: Unknown result type (might be due to invalid IL or missing references)
			Character observedCharacter = Character.observedCharacter;
			return Vector3.Distance(((Object)(object)observedCharacter != (Object)null) ? observedCharacter.Center : localCharacter.Center, targetCharacter.Center);
		}

		private static void UpdateNameText(PlayerName playerName, Character? targetCharacter, Character? localCharacter)
		{
			if (!Plugin.DistanceOverlayEnabled || (Object)(object)playerName.text == (Object)null || (Object)(object)playerName.characterInteractable == (Object)null || (Object)(object)targetCharacter == (Object)null || (Object)(object)localCharacter == (Object)null || (Object)(object)targetCharacter == (Object)(object)localCharacter)
			{
				RestoreNameText(playerName);
				return;
			}
			float distanceToViewer = GetDistanceToViewer(localCharacter, targetCharacter);
			((TMP_Text)playerName.text).text = $"{playerName.characterInteractable.GetName()} {Mathf.RoundToInt(distanceToViewer)}m";
		}

		private static void RestoreNameText(PlayerName? playerName)
		{
			if (!((Object)(object)playerName == (Object)null) && !((Object)(object)playerName.text == (Object)null) && !((Object)(object)playerName.characterInteractable == (Object)null))
			{
				((TMP_Text)playerName.text).text = playerName.characterInteractable.GetName();
			}
		}

		private bool EnsureSegments(Transform parent)
		{
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Expected O, but got Unknown
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: 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_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0228: 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_0281: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d1: Expected O, but got Unknown
			//IL_0317: Unknown result type (might be due to invalid IL or missing references)
			//IL_030a: Unknown result type (might be due to invalid IL or missing references)
			//IL_031c: Unknown result type (might be due to invalid IL or missing references)
			//IL_035d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0396: Unknown result type (might be due to invalid IL or missing references)
			//IL_041d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0433: Unknown result type (might be due to invalid IL or missing references)
			//IL_0449: Unknown result type (might be due to invalid IL or missing references)
			//IL_0455: Unknown result type (might be due to invalid IL or missing references)
			//IL_046b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0477: Unknown result type (might be due to invalid IL or missing references)
			//IL_04db: Unknown result type (might be due to invalid IL or missing references)
			//IL_04e0: Unknown result type (might be due to invalid IL or missing references)
			StaminaBar val = (((Object)(object)GUIManager.instance != (Object)null) ? GUIManager.instance.bar : null);
			if ((Object)(object)val == (Object)null || val.afflictions == null || val.afflictions.Length == 0)
			{
				return false;
			}
			if ((Object)(object)_container != (Object)null && (Object)(object)_sourceBar == (Object)(object)val && (Object)(object)((Transform)_container).parent == (Object)(object)parent && _segments.Count == val.afflictions.Length)
			{
				RemoveDuplicateContainers(parent, ((Component)_container).gameObject);
				return true;
			}
			ClearSegments();
			_sourceBar = val;
			GameObject val2 = new GameObject("OverheadStaminaBar", new Type[1] { typeof(RectTransform) });
			val2.transform.SetParent(parent, false);
			_container = val2.GetComponent<RectTransform>();
			_container.anchorMin = new Vector2(0.5f, 0.5f);
			_container.anchorMax = new Vector2(0.5f, 0.5f);
			_container.pivot = new Vector2(0.5f, 0.5f);
			RemoveDuplicateContainers(parent, ((Component)_container).gameObject);
			GameObject val3 = (GameObject)(((Object)(object)val.maxStaminaBar != (Object)null) ? ((object)Object.Instantiate<GameObject>(((Component)val.maxStaminaBar).gameObject, (Transform)(object)_container)) : ((object)new GameObject("OverheadStaminaEmpty", new Type[3]
			{
				typeof(RectTransform),
				typeof(CanvasRenderer),
				typeof(Image)
			})));
			((Object)val3).name = "OverheadStaminaEmpty";
			RemoveCopiedNestedStaminaBar(val3, val);
			RemoveCopiedStaminaInfoText(val3);
			val3.transform.SetParent((Transform)(object)_container, false);
			_staminaEmpty = val3.GetComponent<RectTransform>();
			_staminaEmptySourceSize = _staminaEmpty.sizeDelta;
			ConfigureBarChild(_staminaEmpty);
			SetRaycastTargets(val3, value: false);
			GameObject val4 = (GameObject)(((Object)(object)val.staminaBar != (Object)null) ? ((object)Object.Instantiate<GameObject>(((Component)val.staminaBar).gameObject, (Transform)(object)_container)) : ((object)new GameObject("OverheadStaminaFill", new Type[3]
			{
				typeof(RectTransform),
				typeof(CanvasRenderer),
				typeof(Image)
			})));
			((Object)val4).name = "OverheadStaminaFill";
			RemoveCopiedStaminaInfoText(val4);
			val4.transform.SetParent((Transform)(object)_container, false);
			_staminaFill = val4.GetComponent<RectTransform>();
			_staminaFillSourceSize = _staminaFill.sizeDelta;
			ConfigureBarChild(_staminaFill);
			SetRaycastTargets(val4, value: false);
			GameObject val5 = new GameObject("OverheadExtraStaminaFill", new Type[3]
			{
				typeof(RectTransform),
				typeof(CanvasRenderer),
				typeof(Image)
			});
			val5.transform.SetParent((Transform)(object)_container, false);
			_extraStaminaFill = val5.GetComponent<RectTransform>();
			_extraStaminaSourceSize = (Vector2)(((Object)(object)val.staminaBar != (Object)null) ? val.staminaBar.sizeDelta : new Vector2(118f, 45f));
			ConfigureLeftAnchoredCenteredBarChild(_extraStaminaFill);
			ConfigureExtraStaminaImage(val5, val);
			if ((Object)(object)val.maxStaminaBar == (Object)null)
			{
				Image component = val3.GetComponent<Image>();
				((Graphic)component).color = new Color(0.56f, 0.62f, 0.57f, 0.75f);
				((Graphic)component).raycastTarget = false;
			}
			if ((Object)(object)val.staminaBar == (Object)null)
			{
				Image component2 = val4.GetComponent<Image>();
				((Graphic)component2).color = new Color(0.36f, 0.82f, 0.2f, 0.95f);
				((Graphic)component2).raycastTarget = false;
			}
			BarAffliction[] afflictions = val.afflictions;
			foreach (BarAffliction val6 in afflictions)
			{
				if (!((Object)(object)val6 == (Object)null))
				{
					GameObject val7 = Object.Instantiate<GameObject>(((Component)val6).gameObject, (Transform)(object)_container);
					((Object)val7).name = "Overhead" + ((object)(STATUSTYPE)(ref val6.afflictionType)).ToString();
					RemoveCopiedStaminaInfoText(val7);
					RectTransform component3 = val7.GetComponent<RectTransform>();
					component3.anchorMin = new Vector2(0.5f, 0.5f);
					component3.anchorMax = new Vector2(0.5f, 0.5f);
					component3.pivot = new Vector2(0.5f, 0.5f);
					component3.anchoredPosition = Vector2.zero;
					component3.sizeDelta = new Vector2(0f, 0f);
					((Transform)component3).localScale = Vector3.one;
					BarAffliction component4 = val7.GetComponent<BarAffliction>();
					RectTransform rect = (((Object)(object)component4.rtf != (Object)null) ? component4.rtf : component3);
					ConfigureBarChild(rect);
					SetRaycastTargets(val7, value: false);
					_segments.Add(new StatusSegment
					{
						GameObject = val7,
						RootRect = component3,
						Rect = rect,
						StatusType = component4.afflictionType
					});
					val7.SetActive(false);
				}
			}
			return _segments.Count > 0;
		}

		private static void RemoveDuplicateContainers(Transform parent, GameObject? keep)
		{
			for (int num = parent.childCount - 1; num >= 0; num--)
			{
				Transform child = parent.GetChild(num);
				if ((Object)(object)((Component)child).gameObject != (Object)(object)keep && ((Object)child).name == "OverheadStaminaBar")
				{
					Object.Destroy((Object)(object)((Component)child).gameObject);
				}
			}
		}

		private static void RemoveCopiedNestedStaminaBar(GameObject root, StaminaBar sourceBar)
		{
			if ((Object)(object)sourceBar.staminaBar == (Object)null)
			{
				return;
			}
			Transform[] componentsInChildren = root.GetComponentsInChildren<Transform>(true);
			for (int num = componentsInChildren.Length - 1; num >= 0; num--)
			{
				Transform val = componentsInChildren[num];
				if ((Object)(object)val != (Object)(object)root.transform && ((Object)val).name == ((Object)sourceBar.staminaBar).name)
				{
					Object.Destroy((Object)(object)((Component)val).gameObject);
				}
			}
		}

		private static void RemoveCopiedStaminaInfoText(GameObject root)
		{
			Transform[] componentsInChildren = root.GetComponentsInChildren<Transform>(true);
			for (int num = componentsInChildren.Length - 1; num >= 0; num--)
			{
				Transform val = componentsInChildren[num];
				if ((Object)(object)val != (Object)(object)root.transform && ((Object)val).name == "StaminaInfo")
				{
					Object.Destroy((Object)(object)((Component)val).gameObject);
				}
			}
		}

		private static void ConfigureBarChild(RectTransform rect)
		{
			//IL_000b: 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_0035: 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)
			rect.anchorMin = new Vector2(0f, 0.5f);
			rect.anchorMax = new Vector2(0f, 0.5f);
			rect.pivot = new Vector2(0f, 0.5f);
			rect.anchoredPosition = Vector2.zero;
		}

		private static void ConfigureLeftAnchoredCenteredBarChild(RectTransform rect)
		{
			//IL_000b: 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_0035: 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)
			rect.anchorMin = new Vector2(0.5f, 0.5f);
			rect.anchorMax = new Vector2(0.5f, 0.5f);
			rect.pivot = new Vector2(0f, 0.5f);
			rect.anchoredPosition = Vector2.zero;
		}

		private static void SetRaycastTargets(GameObject gameObject, bool value)
		{
			Graphic[] componentsInChildren = gameObject.GetComponentsInChildren<Graphic>(true);
			for (int i = 0; i < componentsInChildren.Length; i++)
			{
				componentsInChildren[i].raycastTarget = value;
			}
		}

		private static void ConfigureExtraStaminaImage(GameObject extraStaminaObject, StaminaBar sourceBar)
		{
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			Image component = extraStaminaObject.GetComponent<Image>();
			Image val = FindFillImage(sourceBar.extraBarStamina) ?? FindFillImage(sourceBar.staminaBar);
			if ((Object)(object)val != (Object)null)
			{
				component.sprite = val.sprite;
				component.type = val.type;
				component.pixelsPerUnitMultiplier = val.pixelsPerUnitMultiplier;
				((Graphic)component).color = ((Graphic)val).color;
			}
			else
			{
				((Graphic)component).color = new Color(0.36f, 0.82f, 0.2f, 0.95f);
			}
			((Graphic)component).raycastTarget = false;
		}

		private static Image? FindFillImage(RectTransform? root)
		{
			if ((Object)(object)root == (Object)null)
			{
				return null;
			}
			Image[] componentsInChildren = ((Component)root).GetComponentsInChildren<Image>(true);
			for (int i = 0; i < componentsInChildren.Length; i++)
			{
				if (((Object)componentsInChildren[i]).name == "Fill")
				{
					return componentsInChildren[i];
				}
			}
			if (componentsInChildren.Length == 0)
			{
				return null;
			}
			return componentsInChildren[0];
		}

		private void ClearSegments()
		{
			//IL_0046: 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_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_005c: 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)
			_segments.Clear();
			if ((Object)(object)_container != (Object)null)
			{
				Object.Destroy((Object)(object)((Component)_container).gameObject);
				_container = null;
			}
			_staminaFill = null;
			_staminaEmpty = null;
			_extraStaminaFill = null;
			_staminaFillSourceSize = Vector2.zero;
			_staminaEmptySourceSize = Vector2.zero;
			_extraStaminaSourceSize = Vector2.zero;
		}

		private void UpdateLayout(Character targetCharacter, CharacterAfflictions afflictions)
		{
			//IL_008d: 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_013b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f0: 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_0214: Unknown result type (might be due to invalid IL or missing references)
			//IL_0221: Unknown result type (might be due to invalid IL or missing references)
			//IL_0231: Unknown result type (might be due to invalid IL or missing references)
			//IL_0243: Unknown result type (might be due to invalid IL or missing references)
			//IL_0248: Unknown result type (might be due to invalid IL or missing references)
			//IL_0259: Unknown result type (might be due to invalid IL or missing references)
			//IL_025b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0250: Unknown result type (might be due to invalid IL or missing references)
			//IL_0335: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c0: 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_02e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_030b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0310: Unknown result type (might be due to invalid IL or missing references)
			//IL_0314: Unknown result type (might be due to invalid IL or missing references)
			//IL_0325: Unknown result type (might be due to invalid IL or missing references)
			//IL_0327: Unknown result type (might be due to invalid IL or missing references)
			//IL_034e: Unknown result type (might be due to invalid IL or missing references)
			//IL_038a: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0461: Unknown result type (might be due to invalid IL or missing references)
			//IL_0478: Unknown result type (might be due to invalid IL or missing references)
			//IL_0491: Unknown result type (might be due to invalid IL or missing references)
			float num = Mathf.Max(0.01f, Plugin.BarScale.Value);
			float num2 = 118f * num;
			float num3 = 12f * num;
			float num4 = 3f * num;
			float num5 = 2f * num;
			float num6 = Mathf.Clamp(12f * num, 0f, num2);
			float num7 = Mathf.Clamp01(targetCharacter.GetMaxStamina()) * num2;
			float num8 = Mathf.Max(0f, num2 - num7);
			float num9 = 0f;
			bool flag = false;
			for (int i = 0; i < _segments.Count; i++)
			{
				StatusSegment statusSegment = _segments[i];
				float currentStatus = afflictions.GetCurrentStatus(statusSegment.StatusType);
				if (currentStatus > 0.01f)
				{
					statusSegment.TargetWidth = Mathf.Min(Mathf.Max(num6, num2 * currentStatus), Mathf.Max(0f, num8 - num9));
					num9 += statusSegment.TargetWidth;
					flag = statusSegment.TargetWidth > 0.5f || flag;
				}
				else
				{
					statusSegment.TargetWidth = 0f;
				}
			}
			float num10 = num7;
			if ((Object)(object)_container == (Object)null)
			{
				return;
			}
			_container.sizeDelta = new Vector2(num2, num3);
			float num11 = 0f;
			Bounds val = default(Bounds);
			bool flag2 = false;
			for (int j = 0; j < _segments.Count; j++)
			{
				StatusSegment statusSegment2 = _segments[j];
				if (statusSegment2.TargetWidth > 0f)
				{
					float num12 = num10 + num11 - num2 * 0.5f;
					statusSegment2.RootRect.anchoredPosition = Vector2.zero;
					statusSegment2.RootRect.sizeDelta = new Vector2(statusSegment2.TargetWidth, num3);
					statusSegment2.Rect.anchoredPosition = Vector2.zero;
					statusSegment2.Rect.sizeDelta = new Vector2(Mathf.Lerp(statusSegment2.Rect.sizeDelta.x, statusSegment2.TargetWidth, Mathf.Min(Time.deltaTime * 10f, 0.1f)), num3);
					statusSegment2.GameObject.SetActive(true);
					Bounds val2 = CalculateSegmentBarBounds(_container, statusSegment2);
					statusSegment2.RootRect.anchoredPosition = new Vector2(num12 - ((Bounds)(ref val2)).min.x, 0f);
					Bounds val3 = CalculateSegmentBarBounds(_container, statusSegment2);
					if (flag2)
					{
						((Bounds)(ref val)).Encapsulate(val3);
					}
					else
					{
						val = val3;
						flag2 = true;
					}
					num11 += statusSegment2.TargetWidth;
				}
				else
				{
					statusSegment2.GameObject.SetActive(false);
				}
			}
			if (!flag2 && _segments.Count > 0)
			{
				StatusSegment statusSegment3 = _segments[0];
				statusSegment3.RootRect.anchoredPosition = Vector2.zero;
				statusSegment3.RootRect.sizeDelta = new Vector2(num6, num3);
				statusSegment3.Rect.anchoredPosition = Vector2.zero;
				statusSegment3.Rect.sizeDelta = new Vector2(num6, num3);
				Bounds val4 = CalculateSegmentBarBounds(_container, statusSegment3);
				if (((Bounds)(ref val4)).size.y > 0.5f)
				{
					val = val4;
					flag2 = true;
				}
			}
			float num13 = (flag2 ? ((Bounds)(ref val)).size.y : num3);
			float num14 = (flag2 ? ((Bounds)(ref val)).center.y : 0f);
			if ((Object)(object)_staminaFill != (Object)null)
			{
				float num15 = Mathf.Clamp(targetCharacter.data.currentStamina * num2, 0f, num7);
				ApplyClonedStaminaLayout(_staminaFill, _staminaFillSourceSize, num15, num13, num14);
				((Component)_staminaFill).gameObject.SetActive(num15 > 0.5f);
			}
			if ((Object)(object)_staminaEmpty != (Object)null)
			{
				ApplyClonedStaminaLayout(_staminaEmpty, _staminaEmptySourceSize, num7, num13, num14);
				((Component)_staminaEmpty).gameObject.SetActive(num7 > 0.5f);
			}
			if ((Object)(object)_extraStaminaFill != (Object)null)
			{
				float num16 = Mathf.Clamp01(targetCharacter.data.extraStamina) * num2;
				float num17 = Mathf.Max(1f, _extraStaminaSourceSize.y);
				float num18 = Mathf.Max(0.01f, num4 / num17);
				_extraStaminaFill.anchoredPosition = new Vector2((0f - num2) * 0.5f, num14 - num13 * 0.5f - num5 - num4 * 0.5f);
				_extraStaminaFill.sizeDelta = new Vector2(num16 / num18, num17);
				((Transform)_extraStaminaFill).localScale = new Vector3(num18, num18, 1f);
				((Component)_extraStaminaFill).gameObject.SetActive(num16 > 0.5f);
			}
			_container.anchoredPosition = new Vector2(0f, 28f);
			((Component)_container).gameObject.SetActive(flag || ((Object)(object)_staminaFill != (Object)null && ((Component)_staminaFill).gameObject.activeSelf) || ((Object)(object)_staminaEmpty != (Object)null && ((Component)_staminaEmpty).gameObject.activeSelf) || ((Object)(object)_extraStaminaFill != (Object)null && ((Component)_extraStaminaFill).gameObject.activeSelf));
		}

		private static Bounds CalculateSegmentBarBounds(RectTransform container, StatusSegment segment)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: 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_0077: 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_0060: 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)
			RectTransform[] componentsInChildren = segment.GameObject.GetComponentsInChildren<RectTransform>(true);
			Bounds result = default(Bounds);
			bool flag = false;
			foreach (RectTransform val in componentsInChildren)
			{
				if (!(((Object)val).name != "Fill") || !(((Object)val).name != "Outline"))
				{
					Bounds val2 = RectTransformUtility.CalculateRelativeRectTransformBounds((Transform)(object)container, (Transform)(object)val);
					if (flag)
					{
						((Bounds)(ref result)).Encapsulate(val2);
						continue;
					}
					result = val2;
					flag = true;
				}
			}
			if (!flag)
			{
				return RectTransformUtility.CalculateRelativeRectTransformBounds((Transform)(object)container, (Transform)(object)segment.Rect);
			}
			return result;
		}

		private static void ApplyClonedStaminaLayout(RectTransform rect, Vector2 sourceSize, float targetWidth, float targetHeight, float targetCenterY)
		{
			//IL_0005: 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_0036: 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)
			float num = Mathf.Max(1f, sourceSize.y);
			float num2 = Mathf.Max(0.01f, targetHeight / num);
			rect.anchoredPosition = new Vector2(0f, targetCenterY);
			rect.sizeDelta = new Vector2(targetWidth / num2, num);
			((Transform)rect).localScale = new Vector3(num2, num2, 1f);
		}
	}
}