using System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("AichoGuardian")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("AichoGuardian")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("D28110A9-E229-4700-AD4D-DCD37486A82B")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8.1", FrameworkDisplayName = ".NET Framework 4.8.1")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace StaminaFieldsLocal; [BepInPlugin("nazhi.valheim.staminafieldslocal", "StaminaFieldsLocal", "1.1.0")] public class Plugin : BaseUnityPlugin { [HarmonyPatch(typeof(Player), "Awake")] public static class Patch_Player_Awake_Force { private static void Postfix(Player __instance) { if (ApplyOnAwake.Value) { __instance.m_staminaRegen = Mathf.Max(0f, BaseRegen.Value); __instance.m_staminaRegenTimeMultiplier = TimeMultiplier.Value; } } } [HarmonyPatch(typeof(Player), "UpdateStats", new Type[] { typeof(float) })] public static class Patch_Player_UpdateStats_dt { private static void Prefix(Player __instance) { float num = Mathf.Max(0f, BaseRegen.Value); float value = TimeMultiplier.Value; float maxStamina = ((Character)__instance).GetMaxStamina(); float stamina = __instance.m_stamina; float num2 = ((maxStamina > 0f) ? (stamina / maxStamina) : 0f); float num3 = ((num2 < 0.5f) ? Mathf.Max(0f, BelowHalfMultiplier.Value) : Mathf.Max(0f, AboveHalfMultiplier.Value)); __instance.m_staminaRegen = num * num3; __instance.m_staminaRegenTimeMultiplier = value; } } public const string ModGUID = "nazhi.valheim.staminafieldslocal"; public const string ModName = "StaminaFieldsLocal"; public const string ModVersion = "1.1.0"; private static Harmony _harmony; internal static ManualLogSource Log; public static ConfigEntry BaseRegen; public static ConfigEntry TimeMultiplier; public static ConfigEntry ApplyOnAwake; public static ConfigEntry BelowHalfMultiplier; public static ConfigEntry AboveHalfMultiplier; private void Awake() { //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; BaseRegen = ((BaseUnityPlugin)this).Config.Bind("General", "BaseRegen", 8f, "Valor para Player.m_staminaRegen (vanilla ~5). Se escala además por % de stamina."); TimeMultiplier = ((BaseUnityPlugin)this).Config.Bind("General", "TimeMultiplier", 1f, "Valor para Player.m_staminaRegenTimeMultiplier (vanilla ~1)."); ApplyOnAwake = ((BaseUnityPlugin)this).Config.Bind("General", "ApplyOnAwake", true, "Si true, también aplica al hacer Awake() del Player."); BelowHalfMultiplier = ((BaseUnityPlugin)this).Config.Bind("Scaling", "BelowHalfMultiplier", 3f, "Multiplicador adicional cuando la stamina actual es <50% del máximo. (3.0 = 3x)"); AboveHalfMultiplier = ((BaseUnityPlugin)this).Config.Bind("Scaling", "AboveHalfMultiplier", 2f, "Multiplicador adicional cuando la stamina actual es ≥50% del máximo. (2.0 = 2x)"); _harmony = new Harmony("nazhi.valheim.staminafieldslocal"); _harmony.PatchAll(typeof(Patch_Player_UpdateStats_dt)); _harmony.PatchAll(typeof(Patch_Player_Awake_Force)); Log.LogInfo((object)"✅ StaminaFieldsLocal 1.1.0 cargado."); } private void OnDestroy() { Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } } internal static string SafeName(Player p) { try { return ((p != null) ? p.GetPlayerName() : null) ?? "(null)"; } catch { return "(name err)"; } } }