Decompiled source of AccurateStaminaDisplay v2.2.0

AccurateStaminaDisplay.dll

Decompiled a month ago
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using GameNetcodeStuff;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("AccurateStaminaDisplay")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Fixes the stamina meter display on the HUD, so it more accurately represents your current stamina percentage.")]
[assembly: AssemblyFileVersion("2.1.4.0")]
[assembly: AssemblyInformationalVersion("2.1.4+5c69ad7592b7a78a53702ffefbe6b5b6805dd2fe")]
[assembly: AssemblyProduct("AccurateStaminaDisplay")]
[assembly: AssemblyTitle("AccurateStaminaDisplay")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("2.1.4.0")]
[module: UnverifiableCode]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace AccurateStaminaDisplay
{
	internal static class NewStaminaMeter
	{
		private const float STAMINA_EMPTY = 0.1f;

		private const float STAMINA_EXHAUSTED = 0.3f;

		private const float METER_EMPTY = 0.29767f;

		private const float METER_FULL = 0.911f;

		private static readonly Color NORM_COLOR = new Color(1f, 0.4626f, 0f);

		private static readonly Color EX_COLOR = new Color(0.9f, 0.1f, 0f);

		private static PlayerControllerB player;

		private static float minStamina;

		private static bool exhausted;

		private static Image meterOverlay;

		private static readonly float OVERLAY_MAX = Mathf.Lerp(0.29767f, 0.911f, Mathf.InverseLerp(0.1f, 1f, 0.3f));

		private static Gradient tzpGrad;

		private static readonly Color LIME = new Color(0.4f, 1f, 0f);

		private const float TZP_LIGHT_MIN = 0.1f;

		private const float TZP_LIGHT_MAX = 0.2f;

		private const float TZP_HEAVY_MIN = 0.65f;

		private const float TZP_HEAVY_MAX = 0.77f;

		private static CanvasRenderer meterAlpha;

		private static CanvasRenderer overlayAlpha;

		private static bool wasClimbing;

		private static Sprite origMeterImg;

		internal static Sprite altMeterImg;

		internal static void UpdateMeter(int playerMovementHinderedPrev)
		{
			//IL_0249: Unknown result type (might be due to invalid IL or missing references)
			//IL_0233: Unknown result type (might be due to invalid IL or missing references)
			//IL_020b: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)player == (Object)null)
			{
				Init();
				return;
			}
			minStamina = ((Plugin.configExhaustionIndicator.Value == ExhaustionIndicator.Empty) ? 0.3f : 0.1f);
			if ((Object)(object)origMeterImg != (Object)null)
			{
				if ((Object)(object)player.sprintMeterUI.sprite == (Object)(object)origMeterImg && minStamina == 0.1f && (Object)(object)altMeterImg != (Object)null)
				{
					player.sprintMeterUI.sprite = altMeterImg;
				}
				else if ((Object)(object)player.sprintMeterUI.sprite == (Object)(object)altMeterImg && minStamina == 0.3f)
				{
					player.sprintMeterUI.sprite = origMeterImg;
				}
			}
			float num = Mathf.InverseLerp(minStamina, 1f, player.sprintMeter);
			player.sprintMeterUI.fillAmount = Mathf.Lerp(0.29767f, 0.911f, num);
			if (player.isClimbingLadder)
			{
				wasClimbing = true;
			}
			else if (player.thisController.isGrounded)
			{
				wasClimbing = false;
			}
			bool flag = playerMovementHinderedPrev > 0 && !wasClimbing && !player.jetpackControls;
			bool flag2 = Plugin.configInhalantInfo.Value && player.drunkness > 0f && tzpGrad != null;
			bool flag3 = Plugin.configExhaustionIndicator.Value == ExhaustionIndicator.ChangeColor || (Plugin.configExhaustionIndicator.Value == ExhaustionIndicator.AlwaysShow && (flag || flag2));
			if (exhausted)
			{
				if (!flag3 || player.isSprinting || (player.sprintMeter >= 0.3f && !flag))
				{
					exhausted = false;
				}
			}
			else if (flag3 && (player.isExhausted || flag || (!player.isSprinting && player.sprintMeter < 0.3f)))
			{
				exhausted = true;
				((Graphic)player.sprintMeterUI).color = EX_COLOR;
			}
			else if (flag2)
			{
				((Graphic)player.sprintMeterUI).color = tzpGrad.Evaluate(player.drunkness);
			}
			else
			{
				((Graphic)player.sprintMeterUI).color = NORM_COLOR;
			}
			if (!((Object)(object)meterOverlay != (Object)null))
			{
				return;
			}
			if (Plugin.configExhaustionIndicator.Value == ExhaustionIndicator.AlwaysShow && !exhausted && !player.criticallyInjured && !flag2)
			{
				meterOverlay.fillAmount = Mathf.Min(player.sprintMeterUI.fillAmount, OVERLAY_MAX);
				if ((Object)(object)overlayAlpha != (Object)null)
				{
					overlayAlpha.SetAlpha(meterAlpha.GetAlpha());
				}
				((Behaviour)meterOverlay).enabled = ((Behaviour)player.sprintMeterUI).enabled;
				((Component)meterOverlay).gameObject.SetActive(true);
			}
			else
			{
				((Component)meterOverlay).gameObject.SetActive(false);
			}
		}

		private static void Init()
		{
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Expected O, but got Unknown
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: 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_0147: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0173: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0184: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			player = GameNetworkManager.Instance.localPlayerController;
			if ((Object)(object)player != (Object)null)
			{
				if ((Object)(object)meterOverlay == (Object)null)
				{
					meterOverlay = ((Component)Object.Instantiate<Transform>(((Component)player.sprintMeterUI).transform, ((Component)player.sprintMeterUI).transform.parent)).GetComponent<Image>();
					((Graphic)meterOverlay).color = EX_COLOR;
					if ((Object)(object)altMeterImg != (Object)null)
					{
						meterOverlay.sprite = altMeterImg;
					}
				}
				if (Chainloader.PluginInfos.ContainsKey("ShyHUD") && (Object)(object)meterOverlay != (Object)null)
				{
					meterAlpha = ((Component)player.sprintMeterUI).GetComponent<CanvasRenderer>();
					overlayAlpha = ((Component)meterOverlay).GetComponent<CanvasRenderer>();
				}
				if ((Object)(object)origMeterImg == (Object)null)
				{
					origMeterImg = player.sprintMeterUI.sprite;
				}
			}
			if (tzpGrad == null)
			{
				tzpGrad = new Gradient();
				tzpGrad.SetKeys((GradientColorKey[])(object)new GradientColorKey[6]
				{
					new GradientColorKey(NORM_COLOR, 0f),
					new GradientColorKey(Color.yellow, 0.1f),
					new GradientColorKey(Color.yellow, 0.2f),
					new GradientColorKey(LIME, 0.65f),
					new GradientColorKey(LIME, 0.77f),
					new GradientColorKey(Color.white, 1f)
				}, (GradientAlphaKey[])(object)new GradientAlphaKey[2]
				{
					new GradientAlphaKey(1f, 0f),
					new GradientAlphaKey(1f, 1f)
				});
			}
		}
	}
	internal enum ExhaustionIndicator
	{
		Empty,
		ChangeColor,
		AlwaysShow,
		DontShow
	}
	[BepInPlugin("butterystancakes.lethalcompany.accuratestaminadisplay", "Accurate Stamina Display", "2.1.4")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		private const string PLUGIN_GUID = "butterystancakes.lethalcompany.accuratestaminadisplay";

		private const string PLUGIN_NAME = "Accurate Stamina Display";

		private const string PLUGIN_VERSION = "2.1.4";

		internal static ConfigEntry<bool> configInhalantInfo;

		internal static ConfigEntry<ExhaustionIndicator> configExhaustionIndicator;

		private void Awake()
		{
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			LoadConfig();
			try
			{
				AssetBundle obj = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "accuratestaminadisplay"));
				NewStaminaMeter.altMeterImg = obj.LoadAsset<Sprite>("SprintMeter");
				obj.Unload(false);
			}
			catch
			{
				((BaseUnityPlugin)this).Logger.LogError((object)"Encountered some error loading asset bundle. Did you install the plugin correctly?");
				return;
			}
			new Harmony("butterystancakes.lethalcompany.accuratestaminadisplay").PatchAll();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Accurate Stamina Display v2.1.4 loaded");
		}

		private void LoadConfig()
		{
			configInhalantInfo = ((BaseUnityPlugin)this).Config.Bind<bool>("Extra", "InhalantInfo", false, "Adjusts the color of the stamina meter to reflect the amount of TZP inhaled. (Light = yellow, heavy = green, \"overdose\" = white)");
			configExhaustionIndicator = ((BaseUnityPlugin)this).Config.Bind<ExhaustionIndicator>("Misc", "ExhaustionIndicator", ExhaustionIndicator.AlwaysShow, "How the stamina meter displays exhaustion. You become exhausted when stamina hits 0% or if you release the sprint key while stamina is 20% or lower.\n\"Empty\" will make the stamina bar display as empty for the last 20% of stamina, just like the original game. \"ChangeColor\" will turn the bar red when you are currently exhausted. \"AlwaysShow\" will always display the last 20% of the bar as red. \"DontShow\" will not display any special indicator for exhaustion.");
			if (configExhaustionIndicator.Value != ExhaustionIndicator.AlwaysShow)
			{
				return;
			}
			bool value = ((BaseUnityPlugin)this).Config.Bind<bool>("Extra", "AlwaysShowRedPortion", true, "Legacy setting, use \"ExhaustionIndicator\" instead").Value;
			bool value2 = ((BaseUnityPlugin)this).Config.Bind<bool>("Extra", "ExhaustedRed", true, "Legacy setting, use \"ExhaustionIndicator\" instead").Value;
			if (((BaseUnityPlugin)this).Config.Bind<bool>("Miscellaneous", "EmptyEarly", false, "Legacy setting, use \"ExhaustionIndicator\" instead").Value)
			{
				configExhaustionIndicator.Value = ExhaustionIndicator.Empty;
			}
			else if (value2)
			{
				if (value)
				{
					configExhaustionIndicator.Value = ExhaustionIndicator.AlwaysShow;
				}
				else
				{
					configExhaustionIndicator.Value = ExhaustionIndicator.ChangeColor;
				}
			}
			else
			{
				configExhaustionIndicator.Value = ExhaustionIndicator.DontShow;
			}
			((BaseUnityPlugin)this).Config.Remove(((BaseUnityPlugin)this).Config["Extra", "AlwaysShowRedPortion"].Definition);
			((BaseUnityPlugin)this).Config.Remove(((BaseUnityPlugin)this).Config["Extra", "ExhaustedRed"].Definition);
			((BaseUnityPlugin)this).Config.Remove(((BaseUnityPlugin)this).Config["Miscellaneous", "EmptyEarly"].Definition);
			((BaseUnityPlugin)this).Config.Save();
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "AccurateStaminaDisplay";

		public const string PLUGIN_NAME = "AccurateStaminaDisplay";

		public const string PLUGIN_VERSION = "2.1.4";
	}
}
namespace AccurateStaminaDisplay.Patches
{
	[HarmonyPatch]
	internal class AccurateStaminaDisplayPatches
	{
		[HarmonyPatch(typeof(PlayerControllerB), "LateUpdate")]
		[HarmonyPostfix]
		public static void PlayerPostLateUpdate(int ___movementHinderedPrev)
		{
			NewStaminaMeter.UpdateMeter(___movementHinderedPrev);
		}
	}
}