using System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Jotunn.Utils; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("0.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace HSEManager { [BepInPlugin("valesthor.hsemanager", "Health, Stamina & Eitr - Manager", "1.0.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { public const string PluginGUID = "valesthor.hsemanager"; public const string PluginName = "Health, Stamina & Eitr - Manager"; public const string PluginVersion = "1.0.1"; internal static ManualLogSource Log; public static ConfigEntry BaseHealth; public static ConfigEntry BaseStamina; public static ConfigEntry BaseEitr; public static ConfigEntry HealthRegenPerSecond; public static ConfigEntry StaminaRegenPerSecond; public static ConfigEntry EitrRegenPerSecond; public static ConfigEntry InfiniteStamina; public static ConfigEntry InfiniteEitr; public static ConfigEntry FixedHealthBar; public static ConfigEntry FixedStaminaBar; public static ConfigEntry FixedEitrBar; public static ConfigEntry AlwaysShowStaminaBar; public static ConfigEntry AlwaysShowEitrBar; private Harmony _harmony; private void Awake() { //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_0018: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Expected O, but got Unknown //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Expected O, but got Unknown //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Expected O, but got Unknown //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Expected O, but got Unknown //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Expected O, but got Unknown //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_0177: Expected O, but got Unknown //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: Expected O, but got Unknown //IL_0256: Unknown result type (might be due to invalid IL or missing references) //IL_0260: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; ConfigurationManagerAttributes val = new ConfigurationManagerAttributes { IsAdminOnly = true }; BaseHealth = ((BaseUnityPlugin)this).Config.Bind("01. Health", "BaseHealth", 25f, new ConfigDescription("Base health value for the local player, before food bonuses are added. Vanilla default is 25. Server-authoritative: locked to the server's value while connected to a multiplayer server.", (AcceptableValueBase)null, new object[1] { val })); BaseStamina = ((BaseUnityPlugin)this).Config.Bind("02. Stamina", "BaseStamina", 75f, new ConfigDescription("Base stamina value for the local player, before food bonuses are added. Vanilla default is 75. Server-authoritative: locked to the server's value while connected to a multiplayer server.", (AcceptableValueBase)null, new object[1] { val })); InfiniteStamina = ((BaseUnityPlugin)this).Config.Bind("02. Stamina", "InfiniteStamina", false, new ConfigDescription("If enabled, stamina is never actually consumed. All vanilla actions and their calculations still run normally. Default: disabled. Server-authoritative: locked to the server's value while connected to a multiplayer server.", (AcceptableValueBase)null, new object[1] { val })); BaseEitr = ((BaseUnityPlugin)this).Config.Bind("03. Eitr", "BaseEitr", 0f, new ConfigDescription("Base Eitr value for the local player, before food bonuses are added. Vanilla default is 0 (Eitr normally comes entirely from food). Server-authoritative: locked to the server's value while connected to a multiplayer server.", (AcceptableValueBase)null, new object[1] { val })); InfiniteEitr = ((BaseUnityPlugin)this).Config.Bind("03. Eitr", "InfiniteEitr", false, new ConfigDescription("If enabled, Eitr is never actually consumed. All vanilla spells and their calculations still run normally. Default: disabled. Server-authoritative: locked to the server's value while connected to a multiplayer server.", (AcceptableValueBase)null, new object[1] { val })); HealthRegenPerSecond = ((BaseUnityPlugin)this).Config.Bind("04. Regeneration", "HealthRegenPerSecond", 0f, new ConfigDescription("Extra health regeneration per second, on top of vanilla regen. Works independently of food and Comfort. 0 = disabled (default). Server-authoritative: locked to the server's value while connected to a multiplayer server.", (AcceptableValueBase)null, new object[1] { val })); StaminaRegenPerSecond = ((BaseUnityPlugin)this).Config.Bind("04. Regeneration", "StaminaRegenPerSecond", 0f, new ConfigDescription("Extra stamina regeneration per second, on top of vanilla regen. Works independently of food and Comfort. 0 = disabled (default). Server-authoritative: locked to the server's value while connected to a multiplayer server.", (AcceptableValueBase)null, new object[1] { val })); EitrRegenPerSecond = ((BaseUnityPlugin)this).Config.Bind("04. Regeneration", "EitrRegenPerSecond", 0f, new ConfigDescription("Extra Eitr regeneration per second, on top of vanilla regen. Works independently of food and Comfort. 0 = disabled (default). Server-authoritative: locked to the server's value while connected to a multiplayer server.", (AcceptableValueBase)null, new object[1] { val })); FixedHealthBar = ((BaseUnityPlugin)this).Config.Bind("05. HUD", "FixedHealthBar", false, "If enabled, the health bar keeps a fixed visual width (as if max health were 100), regardless of actual max health. Values and fill percentage are unaffected. Default: disabled."); FixedStaminaBar = ((BaseUnityPlugin)this).Config.Bind("05. HUD", "FixedStaminaBar", false, "If enabled, the stamina bar keeps a fixed visual width (as if max stamina were 100), regardless of actual max stamina. Values and fill percentage are unaffected. Default: disabled."); AlwaysShowStaminaBar = ((BaseUnityPlugin)this).Config.Bind("05. HUD", "AlwaysShowStaminaBar", false, "If enabled, the stamina bar stays visible at all times, even when full and unused. Has no effect if Infinite Stamina is on (bar already stays hidden in that case). Default: disabled."); FixedEitrBar = ((BaseUnityPlugin)this).Config.Bind("05. HUD", "FixedEitrBar", false, "If enabled, the Eitr bar keeps a fixed visual width (as if max Eitr were 100), regardless of actual max Eitr. Values and fill percentage are unaffected. Default: disabled."); AlwaysShowEitrBar = ((BaseUnityPlugin)this).Config.Bind("05. HUD", "AlwaysShowEitrBar", false, "If enabled, the Eitr bar stays visible at all times, even when full and unused. Has no effect if Infinite Eitr is on (bar already stays hidden in that case). Default: disabled."); _harmony = new Harmony("valesthor.hsemanager"); _harmony.PatchAll(); Log.LogInfo((object)string.Format("{0} v{1} loaded. BaseHealth = {2}, BaseStamina = {3}, BaseEitr = {4} HealthRegenPerSecond = {5}, StaminaRegenPerSecond = {6}, EitrRegenPerSecond = {7} InfiniteStamina = {8}, InfiniteEitr = {9} FixedHealthBar = {10}, FixedStaminaBar = {11}, FixedEitrBar = {12} AlwaysShowStaminaBar = {13}, AlwaysShowEitrBar = {14}", "Health, Stamina & Eitr - Manager", "1.0.1", BaseHealth.Value, BaseStamina.Value, BaseEitr.Value, HealthRegenPerSecond.Value, StaminaRegenPerSecond.Value, EitrRegenPerSecond.Value, InfiniteStamina.Value, InfiniteEitr.Value, FixedHealthBar.Value, FixedStaminaBar.Value, FixedEitrBar.Value, AlwaysShowStaminaBar.Value, AlwaysShowEitrBar.Value)); } } } namespace HSEManager.Patches { [HarmonyPatch(typeof(Player), "GetTotalFoodValue")] public static class Player_GetTotalFoodValue_BaseEitr_Patch { [HarmonyPostfix] public static void Postfix(ref float eitr) { eitr += Plugin.BaseEitr.Value; } } public static class FixedHudPatch { [HarmonyPatch(typeof(Hud), "SetHealthBarSize")] public static class SetHealthBarSize_Patch { [HarmonyPrefix] public static void Prefix(ref float size) { if (Plugin.FixedHealthBar.Value) { size = 128f; } } } [HarmonyPatch(typeof(Hud), "SetStaminaBarSize")] public static class SetStaminaBarSize_Patch { [HarmonyPrefix] public static void Prefix(ref float size) { if (Plugin.FixedStaminaBar.Value) { size = 128f; } } } [HarmonyPatch(typeof(Hud), "SetEitrBarSize")] public static class SetEitrBarSize_Patch { [HarmonyPrefix] public static void Prefix(ref float size) { if (Plugin.FixedEitrBar.Value) { size = 128f; } } } private const float ReferenceBarSize = 128f; } [HarmonyPatch(typeof(Hud), "UpdateStamina")] public static class Hud_UpdateStamina_AlwaysShow_Patch { [HarmonyPostfix] public static void Postfix(Hud __instance) { if (Plugin.AlwaysShowStaminaBar.Value) { __instance.m_staminaAnimator.SetBool("Visible", true); } } } [HarmonyPatch(typeof(Hud), "UpdateEitr")] public static class Hud_UpdateEitr_AlwaysShow_Patch { [HarmonyPostfix] public static void Postfix(Hud __instance) { if (Plugin.AlwaysShowEitrBar.Value) { __instance.m_eitrAnimator.SetBool("Visible", true); } } } [HarmonyPatch(typeof(Player), "Awake")] public static class Player_Awake_BaseHealth_Patch { [HarmonyPostfix] public static void Postfix(Player __instance) { __instance.m_baseHP = Plugin.BaseHealth.Value; Plugin.Log.LogInfo((object)$"[HSE] Applied BaseHealth={Plugin.BaseHealth.Value} to Player instance."); } } [HarmonyPatch(typeof(Player), "RPC_UseStamina")] public static class Player_RPC_UseStamina_Infinite_Patch { [HarmonyPrefix] public static bool Prefix(Player __instance) { if ((Object)(object)__instance != (Object)(object)Player.m_localPlayer) { return true; } return !Plugin.InfiniteStamina.Value; } } [HarmonyPatch(typeof(Player), "RPC_UseEitr")] public static class Player_RPC_UseEitr_Infinite_Patch { [HarmonyPrefix] public static bool Prefix(Player __instance) { if ((Object)(object)__instance != (Object)(object)Player.m_localPlayer) { return true; } return !Plugin.InfiniteEitr.Value; } } [HarmonyPatch(typeof(Player), "UpdateStats", new Type[] { typeof(float) })] public static class Player_UpdateStats_ExtraRegen_Patch { [HarmonyPostfix] public static void Postfix(Player __instance, float dt) { if (!((Object)(object)__instance != (Object)(object)Player.m_localPlayer)) { float value = Plugin.HealthRegenPerSecond.Value; if (value > 0f) { ((Character)__instance).Heal(value * dt, false); } float value2 = Plugin.StaminaRegenPerSecond.Value; if (value2 > 0f) { ((Character)__instance).AddStamina(value2 * dt); } float value3 = Plugin.EitrRegenPerSecond.Value; if (value3 > 0f) { ((Character)__instance).AddEitr(value3 * dt); } } } } [HarmonyPatch(typeof(Player), "Awake")] public static class Player_Awake_BaseStamina_Patch { [HarmonyPostfix] public static void Postfix(Player __instance) { __instance.m_baseStamina = Plugin.BaseStamina.Value; Plugin.Log.LogInfo((object)$"[HSE] Applied BaseStamina={Plugin.BaseStamina.Value} to Player instance."); } } }