Decompiled source of StaminaSystem v1.1.0

plugins/StaminaSystem.dll

Decompiled 5 months ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Threading.Tasks;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using HarmonyLib;
using Il2CppSystem.Collections.Generic;
using Microsoft.CodeAnalysis;
using SOD.Common;
using StaminaSystem;
using UnityEngine;
using UnityEngine.UI;
using UnityStandardAssets.Characters.FirstPerson;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("StaminaSystem")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+7bf2506111f48113368162e25beeaaa68ae35a1b")]
[assembly: AssemblyProduct("StaminaSystem")]
[assembly: AssemblyTitle("StaminaSystem")]
[assembly: AssemblyVersion("1.0.0.0")]
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;
		}
	}
}
public static class CustomColors
{
	public static Color Transparent => new Color(1f, 1f, 1f, 0f);

	public static Color Red => new Color(1f, 0f, 0f, 1f);

	public static Color Green => new Color(0f, 1f, 0f, 1f);
}
public class NewGameHandler
{
	public static ManualLogSource Logger;

	public NewGameHandler()
	{
		Lib.SaveGame.OnAfterLoad += HandleGameLoaded;
		Lib.SaveGame.OnAfterNewGame += HandleNewGameStarted;
	}

	private void HandleNewGameStarted(object sender, EventArgs e)
	{
		StaminaBar.isGameLoaded = true;
	}

	private void HandleGameLoaded(object sender, EventArgs e)
	{
		StaminaBar.isGameLoaded = true;
	}
}
public class PlayerInfoProvider
{
	public Vector3 GetPlayerLocation()
	{
		//IL_0008: 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)
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_0015: Unknown result type (might be due to invalid IL or missing references)
		Player instance = Player.Instance;
		return Vector3Int.op_Implicit(((Actor)instance).currentNodeCoord);
	}

	public NewNode PlayerNode()
	{
		Player instance = Player.Instance;
		return ((Actor)instance).currentNode;
	}

	public bool GetIsRunning()
	{
		Player instance = Player.Instance;
		return ((Actor)instance).isRunning;
	}

	public void SetIsRunning(bool isRunning)
	{
		Player instance = Player.Instance;
		((Actor)instance).isRunning = isRunning;
	}

	public bool GetHasJumped()
	{
		FirstPersonController val = Object.FindObjectOfType<FirstPersonController>();
		return val.m_Jump;
	}

	public bool GetIsJumping()
	{
		FirstPersonController val = Object.FindObjectOfType<FirstPersonController>();
		return val.m_Jumping;
	}

	public bool GetIsGrounded()
	{
		Player instance = Player.Instance;
		return instance.isGrounded;
	}

	public float GetMovementRunSpeed()
	{
		GameplayControls instance = GameplayControls.Instance;
		return instance.playerRunSpeed;
	}

	public void SetMovementRunSpeed(float setMovementRunSpeed)
	{
		GameplayControls instance = GameplayControls.Instance;
		instance.playerRunSpeed = setMovementRunSpeed;
	}

	public float GetMovementWalkSpeed()
	{
		GameplayControls instance = GameplayControls.Instance;
		return instance.playerWalkSpeed;
	}

	public void SetMovementWalkSpeed(float setMovementWalkSpeed)
	{
		GameplayControls instance = GameplayControls.Instance;
		instance.playerWalkSpeed = setMovementWalkSpeed;
	}

	public float GetCurrentHealth()
	{
		Player instance = Player.Instance;
		return ((Actor)instance).currentHealth;
	}

	public void SetCurrentHealth(float health)
	{
		Player instance = Player.Instance;
		((Actor)instance).currentHealth = health;
	}

	public bool IsOnDuty()
	{
		Player instance = Player.Instance;
		return ((Actor)instance).isOnDuty;
	}

	public bool IsCurrentlyInAutoTravel()
	{
		Player instance = Player.Instance;
		return instance.autoTravelActive;
	}

	public float GetBlackEye()
	{
		Player instance = Player.Instance;
		return ((Human)instance).blackEye;
	}

	public void SetBlackEye(float amount)
	{
		Player instance = Player.Instance;
		((Human)instance).blackEye = amount;
	}

	public float GetBlackedOut()
	{
		Player instance = Player.Instance;
		return ((Human)instance).blackedOut;
	}

	public void SetBlackedOut(float amount)
	{
		Player instance = Player.Instance;
		((Human)instance).blackedOut = amount;
	}

	public void AddEnergy(float amount)
	{
		Player instance = Player.Instance;
		((Human)instance).AddEnergy(amount);
	}

	public void AddNourishment(float amount)
	{
		Player instance = Player.Instance;
		((Human)instance).AddNourishment(amount);
	}

	public Telephone GetAnsweringPhone()
	{
		Player instance = Player.Instance;
		return instance.answeringPhone;
	}

	public List<NewAddress> ApartmentsOwned()
	{
		Player instance = Player.Instance;
		return instance.apartmentsOwned;
	}
}
namespace StaminaSystem
{
	public class CreateStaminaBar
	{
		private static GameObject staminaPanel;

		public static void CreateBar()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Expected O, but got Unknown
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: 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_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_016b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0194: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			staminaPanel = new GameObject("StaminaBarBackground");
			Canvas val = Object.FindObjectOfType<Canvas>();
			if ((Object)(object)val == (Object)null)
			{
				val = new GameObject("Canvas").AddComponent<Canvas>();
				val.renderMode = (RenderMode)0;
				((Component)val).gameObject.AddComponent<CanvasScaler>();
				((Component)val).gameObject.AddComponent<GraphicRaycaster>();
			}
			staminaPanel.transform.SetParent(((Component)val).transform);
			RectTransform val2 = staminaPanel.AddComponent<RectTransform>();
			val2.sizeDelta = new Vector2(0f, 0f);
			val2.anchorMin = new Vector2(0.5f, 0f);
			val2.anchorMax = new Vector2(0.5f, 0f);
			val2.anchoredPosition = new Vector2(0f, 20f);
			Image val3 = staminaPanel.AddComponent<Image>();
			((Graphic)val3).color = Color.black;
			GameObject val4 = new GameObject("StaminaFill");
			val4.transform.SetParent(staminaPanel.transform);
			StaminaBar.staminaFillRect = val4.AddComponent<RectTransform>();
			StaminaBar.staminaFillRect.sizeDelta = new Vector2(500f, 10f);
			StaminaBar.staminaFillRect.anchorMin = Vector2.zero;
			StaminaBar.staminaFillRect.anchorMax = Vector2.one;
			StaminaBar.staminaFillRect.anchoredPosition = Vector2.zero;
			StaminaBar.staminaFill = val4.AddComponent<Image>();
			((Graphic)StaminaBar.staminaFill).color = StaminaBar.currentColor;
			Outline val5 = val4.AddComponent<Outline>();
			((Shadow)val5).effectColor = new Color(0f, 0f, 0f, 1f);
			((Shadow)val5).effectDistance = new Vector2(4f, 4f);
		}

		public static void DestroyBar()
		{
			if ((Object)(object)staminaPanel != (Object)null)
			{
				Object.Destroy((Object)(object)staminaPanel.gameObject);
				StaminaSystem.Logger.LogInfo((object)"Deleted old stamina bar");
			}
		}

		public static void UpdateStamina(float amount)
		{
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			StaminaBar.currentStamina += amount;
			StaminaBar.currentStamina = Mathf.Clamp(StaminaBar.currentStamina, 0f, StaminaBar.maxStamina);
			if (StaminaBar.staminaBarCreated)
			{
				StaminaBar.staminaFill.fillAmount = StaminaBar.currentStamina / StaminaBar.maxStamina;
				float num = StaminaBar.currentStamina / StaminaBar.maxStamina * 500f;
				((Graphic)StaminaBar.staminaFill).rectTransform.sizeDelta = new Vector2(num, 10f);
			}
		}

		public static void ResetStamina()
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			StaminaBar.currentStamina = StaminaBar.maxStamina;
			StaminaBar.staminaFillRect.sizeDelta = new Vector2(500f, 10f);
		}
	}
	[BepInPlugin("StaminaSystem", "StaminaSystem", "1.1.0")]
	public class StaminaSystem : BasePlugin
	{
		public static ManualLogSource Logger;

		private Harmony harmony;

		public static ConfigEntry<float> staminaDrain;

		public static ConfigEntry<float> staminaRegain;

		public static ConfigEntry<float> staminaJumpDrain;

		public static ConfigEntry<float> minStamToRunJump;

		public static ConfigEntry<bool> staminaBar;

		public static ConfigEntry<float> staminaDrainMeleeFist;

		public static ConfigEntry<float> staminaDrainMeleeWeapon;

		public static ConfigEntry<float> staminaDrainBlock;

		public static ConfigEntry<float> staminaDrainThrowables;

		public static ConfigEntry<float> minStamToAttack;

		public override void Load()
		{
			//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c9: Expected O, but got Unknown
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0197: Expected O, but got Unknown
			Logger = ((BasePlugin)this).Log;
			NewGameHandler newGameHandler = new NewGameHandler();
			Logger.LogInfo((object)"Loading Stamina System...");
			staminaDrainMeleeFist = ((BasePlugin)this).Config.Bind<float>("Stamina Melee Drain (Fists)", "Drain Amount", -40f, "How much stamina drained by melee attacks with fists.");
			staminaDrainMeleeWeapon = ((BasePlugin)this).Config.Bind<float>("Stamina Melee Drain (Weapons)", "Drain Amount", -55f, "How much stamina drained by melee attacks with a weapon.");
			staminaDrainThrowables = ((BasePlugin)this).Config.Bind<float>("Stamina Throwables Drain", "Drain Amount", -50f, "How much stamina drained by throwing certain items.");
			staminaDrainBlock = ((BasePlugin)this).Config.Bind<float>("Stamina Blocking Drain", "Drain Amount", -10f, "How much stamina drained by blocking.");
			staminaDrain = ((BasePlugin)this).Config.Bind<float>("Stamina Drain (Sprinting)", "Drain Speed", -20f, "How fast stamina drains while sprinting.");
			staminaRegain = ((BasePlugin)this).Config.Bind<float>("Stamina Regain", "Regain Speed", 20f, "How fast stamina regains.");
			staminaJumpDrain = ((BasePlugin)this).Config.Bind<float>("Stamina Jump Drain", "Jump Drain Amount", -15f, "How much stamina drained by jumping.");
			minStamToRunJump = ((BasePlugin)this).Config.Bind<float>("Allowed Run/Jump At", "Minimum", 35f, "Minimum amount of stamina before allowing player to run/jump again.");
			minStamToAttack = ((BasePlugin)this).Config.Bind<float>("Allowed Attack At", "Minimum", 1f, "Minimum amount of stamina before allowing player to attack.");
			staminaBar = ((BasePlugin)this).Config.Bind<bool>("Stamina Bar", "Enabled", true, "Show's a visible stamina bar at the bottom of the screen.");
			try
			{
				harmony = new Harmony("StaminaSystem");
				harmony.PatchAll();
				Logger.LogInfo((object)"All patches applied.");
			}
			catch (Exception ex)
			{
				ManualLogSource logger = Logger;
				bool flag = default(bool);
				BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(19, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Error during Load: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
				}
				logger.LogError(val);
			}
		}
	}
	[HarmonyPatch(typeof(SessionData))]
	[HarmonyPatch("PauseGame")]
	public class PauseManager
	{
		public static void Prefix(ref bool showPauseText, ref bool delayOverride, ref bool openDesktopMode)
		{
			StaminaBar.isGamePaused = true;
		}
	}
	[HarmonyPatch(typeof(SessionData))]
	[HarmonyPatch("ResumeGame")]
	public class ResumeGameManager
	{
		public static void Prefix()
		{
			StaminaBar.isGamePaused = false;
		}
	}
	[HarmonyPatch(typeof(Player), "Update")]
	public class StaminaBar
	{
		public static bool staminaBarCreated;

		private static bool startedRunningOverStam;

		public static bool isGamePaused = false;

		public static bool isGameLoaded = false;

		public static bool isPlayerJumping;

		public static Image staminaFill;

		public static Color currentColor;

		public static float maxStamina = 100f;

		public static float currentStamina;

		public static RectTransform staminaFillRect;

		private static PlayerInfoProvider _playerInfo;

		private static FirstPersonController _control;

		public static PlayerInfoProvider playerInfo
		{
			get
			{
				if (_playerInfo == null)
				{
					_playerInfo = new PlayerInfoProvider();
				}
				return _playerInfo;
			}
		}

		public static FirstPersonController control
		{
			get
			{
				if ((Object)(object)_control == (Object)null)
				{
					_control = Object.FindObjectOfType<FirstPersonController>();
				}
				return _control;
			}
		}

		[HarmonyPrefix]
		public static void Prefix(Player __instance)
		{
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_026e: 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_02c1: Unknown result type (might be due to invalid IL or missing references)
			if (!staminaBarCreated)
			{
				currentStamina = maxStamina;
				CreateStaminaBar.CreateBar();
				staminaBarCreated = true;
			}
			if (!StaminaSystem.staminaBar.Value && staminaBarCreated)
			{
				((Graphic)staminaFill).color = CustomColors.Transparent;
			}
			if (playerInfo.GetIsRunning() && !isGamePaused)
			{
				if (currentStamina > StaminaSystem.minStamToRunJump.Value)
				{
					startedRunningOverStam = true;
				}
				CreateStaminaBar.UpdateStamina(StaminaSystem.staminaDrain.Value * Time.deltaTime);
			}
			else if (!playerInfo.GetIsRunning() && !isGamePaused && isGameLoaded)
			{
				CreateStaminaBar.UpdateStamina(StaminaSystem.staminaRegain.Value * Time.deltaTime);
				startedRunningOverStam = false;
			}
			if (currentStamina <= 0f && !isGamePaused && isGameLoaded)
			{
				StatusController.Instance.disabledSprint = true;
				StatusController.Instance.disabledJump = true;
				control.m_Jump = false;
				if (staminaBarCreated && StaminaSystem.staminaBar.Value)
				{
					((Graphic)staminaFill).color = CustomColors.Red;
				}
			}
			else if (currentStamina < StaminaSystem.minStamToRunJump.Value && !startedRunningOverStam && !isGamePaused && isGameLoaded)
			{
				StatusController.Instance.disabledSprint = true;
				StatusController.Instance.disabledJump = true;
				control.m_Jump = false;
				if (staminaBarCreated && StaminaSystem.staminaBar.Value)
				{
					((Graphic)staminaFill).color = CustomColors.Red;
				}
			}
			else if (!isGamePaused && isGameLoaded)
			{
				StatusController.Instance.disabledSprint = false;
				StatusController.Instance.disabledJump = false;
				if (staminaBarCreated && StaminaSystem.staminaBar.Value)
				{
					((Graphic)staminaFill).color = CustomColors.Green;
				}
			}
			if (isGamePaused && isGameLoaded && currentStamina != maxStamina && staminaBarCreated)
			{
				((Graphic)staminaFill).color = CustomColors.Transparent;
			}
			if (playerInfo.GetIsJumping())
			{
				CreateStaminaBar.UpdateStamina(StaminaSystem.staminaJumpDrain.Value);
				control.m_Jumping = false;
			}
			if (__instance.playerKOInProgress)
			{
				CreateStaminaBar.ResetStamina();
				((Graphic)staminaFill).color = CustomColors.Transparent;
			}
			if (currentStamina == maxStamina)
			{
				((Graphic)staminaFill).CrossFadeAlpha(0f, 0.2f, true);
			}
			else if (currentStamina != maxStamina)
			{
				((Graphic)staminaFill).CrossFadeAlpha(1f, 1f, true);
			}
		}
	}
	[HarmonyPatch(typeof(Player), "OnDestroy")]
	public static class StaminaBarCleanup
	{
		[HarmonyPostfix]
		public static void Postfix(Player __instance)
		{
			if (StaminaBar.staminaBarCreated)
			{
				CreateStaminaBar.DestroyBar();
				StaminaBar.staminaBarCreated = false;
			}
		}
	}
	[HarmonyPatch(typeof(FirstPersonItemController), "MeleeAttack")]
	[HarmonyPriority(600)]
	public static class MeleeAttackPatch
	{
		public static void Prefix(FirstPersonItemController __instance)
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Invalid comparison between Unknown and I4
			if (StaminaBar.staminaBarCreated)
			{
				float value = StaminaSystem.staminaDrainMeleeWeapon.Value;
				if (BioScreenController.Instance.selectedSlot != null && (int)BioScreenController.Instance.selectedSlot.isStatic == 3)
				{
					value = StaminaSystem.staminaDrainMeleeFist.Value;
				}
				CreateStaminaBar.UpdateStamina(value);
			}
		}
	}
	[HarmonyPatch(typeof(FirstPersonItemController), "OnInteraction")]
	[HarmonyPriority(600)]
	public static class OnInteractionPatch
	{
		public static bool hasBeenDelayed;

		public static void Prefix(FirstPersonItemController __instance, InteractionKey input)
		{
			if (StaminaBar.currentStamina <= StaminaSystem.minStamToAttack.Value && !hasBeenDelayed)
			{
				float delayAmount = (StaminaSystem.minStamToRunJump.Value - StaminaBar.currentStamina + 0.7f) / 20f;
				__instance.attackMainDelay += delayAmount;
				hasBeenDelayed = true;
				Task.Run(async delegate
				{
					await Task.Delay((int)(delayAmount * 1000f));
					hasBeenDelayed = false;
				});
			}
		}
	}
	[HarmonyPatch(typeof(FirstPersonItemController), "Block")]
	[HarmonyPriority(600)]
	public static class BlockPatch
	{
		public static void Prefix(FirstPersonItemController __instance)
		{
			if (StaminaBar.staminaBarCreated)
			{
				CreateStaminaBar.UpdateStamina(StaminaSystem.staminaDrainBlock.Value);
			}
		}
	}
	[HarmonyPatch(typeof(FirstPersonItemController), "ThrowGrenade")]
	[HarmonyPriority(600)]
	public static class ThrowGrenadePatch
	{
		public static void Prefix(FirstPersonItemController __instance)
		{
			if (StaminaBar.staminaBarCreated)
			{
				CreateStaminaBar.UpdateStamina(StaminaSystem.staminaDrainThrowables.Value);
			}
		}
	}
}